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

题目的意思:

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

 例子1

下图是第一个例子,可以看到 B 是 A 的子结构。

![image](https://upload-images.jianshu.io/upload_images/22736492-c56914d5254e486b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

第一个例子的判断逻辑是:

*  比较当前节点值

*  递归比较左右节点的值

*  直到遍历完 B 树

例子 2

下图是第二个例子,可以看到 B 也是 A 的子结构。

![image](https://upload-images.jianshu.io/upload_images/22736492-e700a70993be5243.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

但是 A 的根节点和 B 的根节点并不相同。因此对于这种情况,需要对 A 树进行递归遍历。如果 B 是 A 的左子树或者右子树的子结构,那么也是可以的。

思想:

1. 首先需要判断A,B的根节点是否一样。

2. 如果不一样,判断A的左孩子和B的根节点是否一样,同理可判断A的右孩子和B的根节点是否一样。依次找下去

如果上述情况都不满足则说明不包含

1.如果找到了A中有值和B中的根节点相同,则比较左右子树是否相同。

2.如果B为空了,则说明包含

3.如果A为空了,则说明不包含

C++

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);

    bool judge(TreeNode* root, TreeNode* subTree);

};

bool Solution :: HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)

{

        if(pRoot1 == NULL || pRoot2 ==NULL)

            return false;

        if(pRoot1->val == pRoot2->val){

            if(judge(pRoot1, pRoot2))

            {

                return true;

            }

        }

        return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);

}

bool Solution :: judge(TreeNode* root, TreeNode* subTree)

{

        if(subTree == NULL)

        {

            return true;

        }

        if(root == NULL)

        {

            return false;

        }

        if(root->val == subTree->val)

        {

            return judge(root->left, subTree->left) && judge(root->right,subTree->right);

        }

        return false;

}

public class Solution {

    //遍历大树

    public boolean HasSubtree(TreeNode root1,TreeNode root2) {

        if(root1 == null || root2 == null){

            return false;

        }

        //如果找到与子树相同根的值,走判断方法

        if(root1.val == root2.val){

            if(judge(root1,root2)){

                return true;

            }

        }

        //遍历左孩子,右孩子

        return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);

    }


    //判断是否是子结构

    public boolean judge(TreeNode root, TreeNode subtree) {

        //子结构已经循环完毕,代表全部匹配

        if(subtree == null){

            return true;

        }

        //大树已经循环完毕,并未成功匹配

        if(root == null){

            return false;

        }

        //相等后判断左右孩子

        if(root.val == subtree.val){

            return judge(root.left, subtree.left) && judge(root.right, subtree.right);

        }

        return false;

    }

}

'''

你可能感兴趣的:(输入两棵二叉树A,B,判断B是不是A的子结构)