AcWing 37. 树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。

我们规定空树不是任何树的子结构。

样例

树A:

     8
    / \
   8   7
  / \
 9   2
    / \
   4   7

树B:

   8
  / \
 9   2

返回 true ,因为B是A的子结构。

问题分析 

先判断两个根节点,如果它们中存在空节点,那么返回false。接下来用isSub函数判断B树是否是A树从根节点开始的子树。如果是那么返回true,否则分别用A树根节点的左孩子和右孩子调用递归函数hasSubtree,如果有返回true的,那么就返回true。在isSub函数中:如果B树根节点为空,那么返回true;接下来判断如果A树根节点为空或者A树根节点和B树根节点的值不相等,那么返回false;上面的条件都不满足说明A树根节点与B树根节点相等,那么我们接下来分别用A树的左孩子和B树的左孩子调用递归函数isSub,用A树的右孩子和B树的右孩子调用递归函数isSub,如果二者都返回true那么返回true,否则返回false。

代码实现

/**
 * 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:
    bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(!pRoot1 || !pRoot2)
            return false;
        if(isSub(pRoot1, pRoot2))
            return true;
        return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
    }
    
    bool isSub(TreeNode* pRoot1, TreeNode* pRoot2){
        if(!pRoot2)
            return true;
        if(!pRoot1 || pRoot1->val != pRoot2->val)
            return false;
        return isSub(pRoot1->left, pRoot2->left) && isSub(pRoot1->right, pRoot2->right);
    }
};

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/89856598