【剑指Offer】面试题26. 树的子结构

题目

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2

给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:0 <= 节点个数 <= 10000

思路

如果A 和 B 当前节点值相等,则判断 B 节点的子树是否是 A 节点子树的子结构,即各个节点值相等(注意: 此时B的子树中的空节点为A的子结构)
如果不是,则递归判断 B 是否是 A 的左节点的子结构;
如果不是,则递归判断 B 是否是 A 的右节点的子结构;

代码

时间复杂度:O(n)
空间复杂度:O(1)

class Solution {
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if (!A || !B) return false;
        bool res = false;
        if (A->val == B->val) res = helper(A, B);
        if (!res) res = isSubStructure(A->left, B);
        if (!res) res = isSubStructure(A->right, B);
        return res;
    }

    bool helper(TreeNode *A, TreeNode *B) {
        if (!B) return true;  // B为空为A的子结构,直接返回true
        if (!A || A->val != B->val) return false;  // B不为空A为空 或 两者值不相等
        return helper(A->left, B->left) && helper(A->right, B->right);
    }
};
posted @ 2020-02-25 20:03  Galaxy_hao  阅读(159)  评论(0编辑  收藏  举报