zoukankan      html  css  js  c++  java
  • 【剑指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);
        }
    };
    
  • 相关阅读:
    Convolution1D与Convolution2D区别
    git
    cast函数
    Ubuntu14.04编译WebRTC For Android代码 2014-07-24
    R语言基础-数组和列表
    疯狂的创业运动
    Autodesk 举办的 Revit 2015 二次开发速成( 1.5 天),教室培训, 地点武汉
    注冊(十一)重注冊带有鉴权信息
    ubuntu14.04无法安装Curl
    Bash脚本中的操作符
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12363489.html
Copyright © 2011-2022 走看看