标签:lse str art 另一个 成就 复杂 节点 c++ span
题目:输入两棵二叉树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 };
标签:lse str art 另一个 成就 复杂 节点 c++ span
原文地址:https://www.cnblogs.com/hellosnow/p/12079411.html