背景:昨晚基本思路想了出來,代碼也基本寫出來了。調試出了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;
}
}