要求:
输入两棵二叉树A和B,判断B是不是A的子结构。 B是A的子结构, 即 A中有出现和B相同的结构和节点值。 (约定空树不是任意一个树的子结构)
案例:
给定树A:
3
/ \
4 5
/ \
1 2
给定树B:
4
/
1
返回true,因为B与A的一个子树拥有相同的结构和节点值。
输入:A = [1,2,3], B = [3,1]
输出:false
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
思路:
两步走:
- 先序遍历树A中的每个节点Na,使用isSubstructure函数
- 判断A中以Na为根节点的子树是否包含树B,使用recur(A,B)函数
- recur(A, B): 1. 终止条件: B=null, return true; A=null, return false; A.val != B.val, return false; 以上都不满足,再递归判断:return recur(A.left, B.left) && recur(A.right, B.right) 2. 返回值:recur(A.left, B.left); recur(A.right, B.right)
- isSub函数: 1. A=null || B=null , return false; 2. recur (A,B) && isSub(A.left,B) && isSub(A.right, B)
代码:
class Solution {
public boolean isSub(TreeNode A, TreeNode B) {
if (A == null || B == null) return false;
return isSub(A.left, B) || isSub(A.right, B) || recur(A, B);//注意此处为或的关系,不是与的关系
}
public boolean recur(TreeNode A, TreeNode B) {
if (B == null) return true;//说明已经将B的叶子节点全部比较结束了
if (A == null) return false;
if (A.val != B.val) return false;
return recur(A.left, B.left) && recur(A.right, B.right);
}
}