《从头再来》剑指offer.26 树的子结构

Posted 欢迎来到我的酒馆,快找个位置随便坐!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《从头再来》剑指offer.26 树的子结构相关的知识,希望对你有一定的参考价值。

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)(注意分辨,树的子树和树的子结构是不一样的!树的子树必须到根结点都满足完全一样,而子结构可以只是子树的一部分)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

     3
    / \\
   4   5
  / \\
 1   2
给定的树 B:

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

构建一个辅助函数,用于判断当B和A的节点值相同的时候,B是否是A的子结构,如果某一个节点A不为空,但对应位置的节点B为空,则B是A的子结构;如果A节点为空,或者A、B的值不等,则B不是A的子结构;如果完全一直,则递归的判断左右子节点是否相等。主函数同样进行递归的判断,A或B为空,则直接返回false;如果两棵树相同,则返回true;否则递归的判断B树是否是A树的左子树或者右子树的子树。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //辅助函数用于判断B是否是A的子树
    //如果B为空,则是
    //如果A为空或者A、B的值不相等,则不是
    //如果相等,则判断左右节点的值是否相等
    bool isSame(TreeNode* A, TreeNode* B){
        if(!B)  return true;
        if(!A || A->val != B->val)  return false;
        return isSame(A->left, B->left) && isSame(A->right, B->right);
    }
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(!A || !B)    return false;
        if(isSame(A, B))    return true;
        return isSubStructure(A->left,B) || isSubStructure(A->right, B);

    }
};

《从头再来》

以上是关于《从头再来》剑指offer.26 树的子结构的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 26. 树的子结构

LeetCode(剑指 Offer)- 26. 树的子结构

剑指 Offer 26. 树的子结构 / 剑指 Offer 27. 二叉树的镜像 / 剑指 Offer 28. 对称的二叉树 / 剑指 Offer 29. 顺时针打印矩阵

无取巧解法,易于理解!剑指 Offer 26. 树的子结构

无取巧解法,易于理解!剑指 Offer 26. 树的子结构

剑指Offer打卡26.树的子结构