剑指offer 26.树的子结构

384 阅读1分钟

要求:

输入两棵二叉树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

思路:

两步走:

  1. 先序遍历树A中的每个节点Na,使用isSubstructure函数
  2. 判断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);
    }
}