树的子结构

来源:互联网 发布:淘宝为什么成功 编辑:程序博客网 时间:2024/05/16 13:10

剑指offer面试题18

题目:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

分析:
1、在树A中找到和B的根节点的值一样的结点R
2、判断树A中以R为根节点的子树是不是包含和树B一样的结构

二叉树遍历:一般采用递归的方法

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    //DoesTree1HaveTree2函数用来判断A中与B树根节点相同 的子树是不是根B包含一样的结构    bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2)    {        if(pRoot2 == NULL)        {            return true;            }        if(pRoot1 == NULL)        {            return false;        }        //递归调用的退出条件        if(pRoot1->val != pRoot2->val)        {            return false;            }        return DoesTree1HaveTree2(pRoot1->left,pRoot2->left) &&            DoesTree1HaveTree2(pRoot1->right,pRoot2->right);    }    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)    {        bool result = false;        if(pRoot1 != NULL && pRoot2 != NULL)        {            //根节点相同,判断此根节点的子树是不是和B相同            if(pRoot1->val == pRoot2->val)            {                result = DoesTree1HaveTree2(pRoot1,pRoot2);            }            //继续查找左右子树有没有和pRoot2根节点相同的结点            if(!result)            {                result = HasSubtree(pRoot1->left,pRoot2);              }            if(!result)            {                result = HasSubtree(pRoot1->right,pRoot2);              }         }        return result;    }};
0 0
原创粉丝点击