树的子结构
Posted hellosnow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的子结构相关的知识,希望对你有一定的参考价值。
题目:输入两棵二叉树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 };
以上是关于树的子结构的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段