【剑指offer】17 树的子结构

题目地址:树的子结构

题目描述                                   

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
  

题目示例                                   

输入:
{8,8,#,9,#,2,#,5},{8,9,#,2}
返回值:
true

解法分析                                   

首先找A中与B根节点相同的节点r,然后比较A中以r为根节点的子树是否包含B的结构。

代码                                         

 1 function HasSubtree(pRoot1, pRoot2)
 2 {
 3     // write code here
 4     //按题干要求,当root1或root2为null的时候,直接返回false
 5     if(pRoot1 === null || pRoot2 === null){
 6         return false;
 7     }else{
 8         var res = false;
 9         //当A的此节点与B的根节点相同时,调用Does1has2()对比A中以r为根节点的子树是否包含B的结构
10         if(pRoot1.val == pRoot2.val) res = Does1has2(pRoot1, pRoot2);
11         //若此节点与B的根节点不相同,则用A的左儿子节点与B根节点进行对比
12         if(!res) res = HasSubtree(pRoot1.left, pRoot2);
13         //若此节点和A的左儿子都与B的根节点不相同,则用A的右儿子节点与B根节点进行对比
14         if(!res) res = HasSubtree(pRoot1.right, pRoot2);
15     }
16     return res;
17 }
18 function Does1has2(node1, node2){
19     //B遍历完都能一一对应,表明B是A的子结构,返回true
20     if(node2 === null) return true;
21     //B没遍历完A却遍历完了,表明B不是A的子结构,返回false
22     if(node1 === null) return false;
23     //如果有节点对应不上,返回false
24     if(node1.val !== node2.val) return false;
25     //此节点对应上了,递归调用Does1has2()来对比子节点
26     return Does1has2(node1.left, node2.left) && Does1has2(node1.right, node2.right);
27 }

执行结果                                   

 
 
原文地址:https://www.cnblogs.com/sunlinan/p/14293843.html