题目描述:
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
例子:
输入:A = [1,2,3], B = [3,1]
输出:false
错误演示代码:
public boolean isSubStructure(TreeNode A, TreeNode B) {
arr[index++]=B;
if(A==null) return false;
if(B==null) return false;
if(A.val==B.val&&B.left==null&&B.right==null){
return true;
}
if(A.val!=B.val){
return isSubStructure(A.left,arr[0])||isSubStructure(A.right,arr[0]);
}
if(A.val==B.val){
return (isSubStructure(A.left,B.left)&&isSubStructure(A.right,B.right))||
(isSubStructure(A,arr[0]));
}
return false;
}
public int index=0;
public TreeNode[] arr=new TreeNode[1000000000];
这是我一开始的思路,通过不断的debug,我最后发现如果在一开始遍历A、B是相同的,但是后面有一个不同,而B的根节点是无法找到的,所以我定义一个数组来保存B的根节点,结果发现这代价是很大的。
后面转变思路,多调用一个函数,不在原函数去动B,这样一来又能保证B不变还能遍历B的全部。
正确代码:
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A!=null&&B!=null)&&(fun(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B));
}
public boolean fun(TreeNode A,TreeNode B){
if(B==null)return true;
if(A==null||A.val!=B.val) return false;
return fun(A.left,B.left)&&fun(A.right,B.right);
}