树的子结构

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

这道题有点复杂,要用到两个递归来判断。首先因为约定的空树不是任意一个树的子树,所以先判断一下两个树是不是为空,若空则返回false。

然后用另一个递归函数判断B是不是当前树A的子结构。如果是,则返回true。如果不是,那么再递归判断B是不是树A的左子树的子树,或者B是不是树A的右子树的子树,只要有一个满足,那么B都算是树A的子树。

在判断子结构的递归函数里,如果B的当前节点为空了,说明到达叶子节点,也就是整个树都是子结构,所以返回true。否则,如果B的当前节点不空,但A的当前节点空了,说明匹配还没完成就没办法继续匹配了,那么返回false。再接下来,对比两个根节点的值是不是一样,如果不一样,肯定不是子结构,也直接返回false。如果值一样,那么递归遍历两棵树的左子树是不是子结构关系,并且两棵树的右子树是不是子结构关系。

c++代码如下:

 1 class Solution {
 2 public:
 3     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
 4     {
 5         if(!pRoot1 || !pRoot2) return false;
 6         if(ispart(pRoot1, pRoot2)) return true;
 7         return HasSubtree(pRoot1->left, pRoot2) || ispart(pRoot1->right, pRoot2);
 8     }
 9     
10     bool ispart(TreeNode* p, TreeNode* q){
11         if(!q) return true;
12         if(!p || p->val != q->val) return false;
13         
14         return ispart(p->left, q->left) && ispart(p->right, q->right);
15         
16     }
17 };
原文地址:https://www.cnblogs.com/hellosnow/p/12079411.html