day18(树的子结构)

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
 
 
提交链接:点击
 
 
思路:判断是否子树,首先在A中递归遍历找到和B树根节点相同的节点R,然后对以R节点为根节点开始的子树和B子树进行“是否完全一样”的比较。这里也利用递归遍历,首先进行判断t2,然后进行根节点判断,看是否一样,如果一样,则递归进行左右子树判断。
 
 
代码:
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        //先在A中找到和B根节点一样的节点,然后分别判断B中根节点左子树、右子树是否是A中一样
        bool flag=false;
        if(pRoot2==NULL || pRoot1==NULL) return false;
        if(pRoot1->val == pRoot2->val) 
            flag=isSubtree(pRoot1,pRoot2);
        if(!flag){
            flag=HasSubtree(pRoot1->left,pRoot2);
        }
        if(!flag){
            flag=HasSubtree(pRoot1->right,pRoot2);
        }
        return flag;
        //return isSubtree(pRoot1,pRoot2)||isSubtree(pRoot1->left,pRoot2)||isSubtree(pRoot1->right,pRoot2);
    }
    bool isSubtree(TreeNode* t1,TreeNode* t2){
        if(t2==NULL) return true; //t2遍历完了,返回true
        if(t1==NULL) return false; //t1遍历完,t2还没有遍历完,返回false
        if(t1->val==t2->val) 
            return isSubtree(t1->left,t2->left) && isSubtree(t1->right,t2->right);
        else 
            return false;
    }
};

 

posted on 2018-10-01 23:06  Magic_chao  阅读(128)  评论(0编辑  收藏  举报

导航