解题思路
此题通过两个递归函数解决
先分析需要解决两个问题
一个是B树中的根节点在A树中的位置,通过递归digui()函数实现,就是遍历A树,找到B树的根节点的位置
第二个问题是 判断两个树是否一样,通过对AB树做递归判断,不为空的节点就一定进行对比。
需要注意的是,在递归过程中,需要记录上次的结果,判断是否流程需要往下走,如
if(A.left != null && !b){
b = digui(A.left,B);
}
if(A.right != null && !b){
b = digui(A.right,B);
}
就是如果没有找到B树才往下个节点
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B == null || A == null){
return false;
}
return digui(A,B);
}
public static boolean digui(TreeNode A, TreeNode B){
if(A == null || B == null){
return false;
}
boolean b = false;
if(A.val == B.val){//相同 递归下个节点
System.out.print("digui"+A.val+","+B.val);
b = checkSame(A,B);
System.out.println(b);
}
if(A.left != null && !b){
b = digui(A.left,B);
}
if(A.right != null && !b){
b = digui(A.right,B);
}
return b;
}
public static boolean checkSame(TreeNode A,TreeNode B){
boolean result = true;
if(A!=null && B!=null && A.val == B.val){
if(B.left != null){
if(!checkSame(A.left,B.left)){
return false;
}
}
if(B.right != null){
return checkSame(A.right,B.right);
}
return true;
}else{
return false;
}
}
}