首页 > 其他 > 详细

树的子结构

时间:2019-12-22 12:28:02      阅读:93      评论:0      收藏:0      [点我收藏+]

题目:输入两棵二叉树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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!