树的子结构

原题:

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

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

样例

树A:                            树B:

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

思想:

在一个树中查找是否存在另一棵树子树可以分为两个步骤:
第一步:遍历整棵树,在树A中找到与树B根结点相同的结点Node。
第二步:遍历以Node为根的子树,看是否与树B相同。

/**
 * 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* A, TreeNode* B) {
        if(A == NULL || B == NULL){
            return false;
        }
        bool result = false;
              //如果两个树的根结点相同,判断其子树是否相同
        if(A->val == B->val) {
            result = isSame(A , B);
        }
        //如果两个树的根结点不同,就继续遍历树A的左右子树。
        if (result == false){
           result = hasSubtree(A->left , B) || hasSubtree(A->right ,B);
        }
        return result;

    }
    bool isSame(TreeNode *A,TreeNode *B){
        //如果B为空则说明两个树相同
        if(B == NULL) return true;
        //如果A为空,但是B不为空,说明两棵树不相等
        if(A == NULL) return false;
        //如果A等于B,则继续遍历两颗树
        if(A->val == B->val) return isSame(A->left , B->left) && isSame(A->right , B->right);
        //如果A和B不相等,则返回false
        return false;
    }
};

 
posted @ 2020-04-16 14:46  毛毛吃火锅不要锅  阅读(67)  评论(0)    收藏  举报