背景:昨晚基本思路想了出来,代码也基本写出来了。调试出了bug,然后比较深夜了,就去睡觉觉了。今天中午调试了一下,还是有点问题,只通过了百分之33.3的样本测试,下午看完书后,就继续调试。终于王天不负有心人,通过了全部的样本测试。加油!
思路如下:1)先判断root1的根节点和root2的根节点是否相等,如果相等就调用sameFunction函数对相等节点进行进一步的处理,sameFunction用的基本思想也是递归:从相等节点开始一直比较下去,先比较树的左边,在比较树的右边
2)如果开始时root1的根节点和root2的根节点不相等,那么就需要从root1的树中找到一个节点和root2根节点相等的节点,找到后就重复不知1),因此这里用的也是递归。
具体代码如下:
public class Test01 {
public static void main(String[] args) {
//测试样例
TreeNode treeNode4=new TreeNode(4);
TreeNode treeNode7=new TreeNode(7);
TreeNode treeNode2=new TreeNode(2);
TreeNode treeNode9=new TreeNode(9);
TreeNode treeNode8=new TreeNode(8);
TreeNode treeNode_8=new TreeNode(8);
TreeNode treeNode_7=new TreeNode(7);
TreeNode SubtreeNode8=new TreeNode(8);
TreeNode SubtreeNode9=new TreeNode(9);
TreeNode SubtreeNode2=new TreeNode(2);
treeNode2.left=treeNode4;
treeNode2.right=treeNode7;
treeNode8.left=treeNode9;
treeNode8.right=treeNode2;
treeNode_8.left=treeNode8;
treeNode_8.right=treeNode_7;
SubtreeNode8.left=SubtreeNode9;
SubtreeNode8.right=SubtreeNode2;
Solution solution=new Solution();
boolean flag=solution.HasSubtree(treeNode_8,SubtreeNode8);
System.out.println(flag);
}
}
class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean flag=false;
//空树的处理
if(root1==null||root2==null) {
return flag;
}
//先判断节点是否一样
//相等
if(root1.val==root2.val) {
flag=sameFuction(root1,root2);
if(flag==true) {
return flag;
}
}
//不相等 ,就继续遍历root1,直到找到一个节点和root1的根节点相等为止
if(flag==false) {
if(root1.left!=null) {
flag=HasSubtree(root1.left, root2);
if(flag==true) {
return flag;//返回true,证明树的左边是一样的
}
}
if(root1.right!=null&flag==false) {
flag=HasSubtree(root1.right, root2);
if(flag==true) {
return flag;//返回true,证明树的右边是一样的
}
}
}
return flag;
}
//这是找到了两个相等节点后的处理,即是此时root1和root2的根节点是一样的
public boolean sameFuction(TreeNode root1,TreeNode root2) {
//此时root1.val==root2.val;
//flag只要为false就可以return;
boolean flag=true;
if(root1.left!=null&root2.left!=null) {
if(root1.left.val==root2.left.val) {
flag=sameFuction(root1.left, root2.left);
if(flag==false) {
return flag;
}
}else {
flag=false;
return flag;
}
}else if (root2.left==null) {
flag=true;
}else {
flag=false;
return flag;
}
if (root1.right!=null&root2.right!=null) {
if(root1.right.val==root2.right.val) {
flag=sameFuction(root1.right, root2.right);
if(flag==false) {
return flag;
}
}else {
flag=false;
return flag;
}
}else if (root2.right==null) {
flag=true;
}else {
flag=false;
return flag;
}
return flag;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}