其他分享
首页 > 其他分享> > 《从头再来》剑指offer.26 树的子结构

《从头再来》剑指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,子树,TreeNode,从头再来,子结构,right,return,节点
来源: https://www.cnblogs.com/azie420/p/14856178.html