剑指Offer_面试题18_树的子结构

来源:互联网 发布:照片转素描软件 编辑:程序博客网 时间:2024/06/06 06:44

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析:这里说的子结构不是子树,只是根据值来判断,更像是“包含”关系吧。首先需要在A树中找到和B根节点值一样的结点,然后判断A的子树和B是否结构和值相同。在A中找到和B的根结点值相同的操作等同于二叉树遍历,用先序遍历逻辑上自然点把。找到这个结点,开始判断两个树是否相同。同样采用递归思想,分别判断根、左孩子、右孩子值是否相同,只要有不同就return false,终止条件是B遍历完为空。

代码:

/*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 result = false;        if(pRoot1 && pRoot2)        {        if(pRoot1->val == pRoot2->val)                result = isSubtree(pRoot1, pRoot2);        if(!result)            result = HasSubtree(pRoot1->left, pRoot2);        if(!result)            result = HasSubtree(pRoot1->right, pRoot2);        }        return result;    }        bool isSubtree(TreeNode *tree1, TreeNode *tree2)    {        if(!tree2) return true;        if(!tree1) return false;        if(tree1->val != tree2->val) return false;                return isSubtree(tree1->left, tree2->left) &&            isSubtree(tree1->right, tree2->right);    }};