题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:第一感觉又要用递归了,如果不用递归思路,也可以解决,但是写起来比较麻烦,我也不打算那样子写,本题用了递归,也有很多细节需要注意。代码思路大概如下:
- 首先判断a,b是否为空,当a,b不管谁为空,都不可能存在子结构。
- 当第一个根节点相同时,判断b是否a子结构,这里需要编写一个函数,从该点开始,判断b是否a的子树(我可能描述不清楚,但是看了代码就很容易理解了)。
- 如果第一个节点不相同。分别将a的左子树和右子树代入这个函数。这样一直递归下去。(emmm,看代码,其实递归思路很简单)。
代码:
java
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean issametree(TreeNode pRoot1, TreeNode pRoot2){
if(pRoot2==null)
return true;
if(pRoot1==null)//注意以上两个if不能顺序打乱
return false;
if(pRoot1.val!=pRoot2.val)
return false;
return issametree(pRoot1.left, pRoot2.left)&&issametree(pRoot1.right, pRoot2.right);
}
public boolean HasSubtree(TreeNode pRoot1,TreeNode pRoot2) {
if(pRoot2==null)
return false;
if(pRoot1==null)
return false;
boolean flag=false;//易错,这里一定要定义为false,因为后面if(flag==false)。假如初始化为true, 并且树的第一个元素不相等,不那么也不会执行仔细那一步的判断了。
if(pRoot1.val==pRoot2.val){
flag=issametree(pRoot1,pRoot2);
}
if(flag==false){
flag=(HasSubtree(pRoot1.right, pRoot2)||HasSubtree(pRoot1.left, pRoot2));
}
return flag;
// write code here
}
}
js:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function issametree(pRoot1, pRoot2){
if(pRoot2==null)
return true;
if(pRoot1==null)//注意以上两个if不能顺序打乱
return false;
if(pRoot1.val!=pRoot2.val)
return false;
return issametree(pRoot1.left, pRoot2.left)&&issametree(pRoot1.right, pRoot2.right);
}
function HasSubtree( pRoot1,pRoot2) {
if(pRoot2==null)
return false;
if(pRoot1==null)
return false;
var flag=false;//易错,这里一定要定义为false,因为后面if(flag==false)。假如初始化为true, 并且树的第一个元素不相等,不那么也不会执行仔细那一步的判断了。
if(pRoot1.val==pRoot2.val){
flag=issametree(pRoot1,pRoot2);
}
if(flag==false){
flag=(HasSubtree(pRoot1.right, pRoot2)||HasSubtree(pRoot1.left, pRoot2));
}
return flag;
}
注意:代码中注释的容易出错,这个题,本来一下子就可以敲好,但是我很多细节忽略了,调试了2个多小时。。。