方法一 递归
若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此,判断树B是否是树A的子结构,需要完成两步工作:
- 先序遍历树A中的每个节点
- 判断树A中的每个节点为根的子树是否包含B
特例:树A或树B为空时,返回false,此时不需要进行判断且可能会影响recur()的判断,直接返回false;isSubStructure()递归到最后时一定会反回false,但是上一层如果匹配则三个"||"中会返回true。
||有阻断作用。
1 /** 2 * Definition for a binary tree node. 3 * function TreeNode(val) { 4 * this.val = val; 5 * this.left = this.right = null; 6 * } 7 */ 8 /** 9 * @param {TreeNode} A 10 * @param {TreeNode} B 11 * @return {boolean} 12 */ 13 var isSubStructure = function(A, B) { 14 if(A == null || B == null) return false; 15 return (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)); 16 //return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, b)); 17 }; 18 19 const recur = (A, B) => { 20 if(B == null) { //B为空说明当前节点前面的节点已经匹配完毕 21 return true; 22 } 23 if(A == null || A.val != B.val) {//A为空说明B不为空 24 return false; 25 } 26 return recur(A.left, B.left) && recur(A.right, B.right); 27 }