树的子结构
题目
输入两棵二叉树A,B,判断B是不是A的子结构。
我们规定空树不是任何树的子结构。
样例
树A:
8
/ \
8 7
/ \
9 2
/ \
4 7
树B:
8
/ \
9 2
返回 true ,因为B是A的子结构。
题解
在先序遍历子树1的同时,判断子树2是否是子树1的子结构
判断函数原理如下:
- 如果子树2为空,无论子树1是否为空,均说明当前树结构匹配,那么返回TRUE
- 如果子树1为空,子树2不为空,说明当前树结构不匹配,那么返回FALSE
- 如果子树1和子树2均不为空,且两者的结点数值不相等,说明当前树结构不匹配,那么返回FALSE
- 递归判断左右子树即为结果
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool judge(TreeNode* pRoot1, TreeNode* pRoot2) {
if (pRoot2 == NULL) return true;
if (pRoot1 == NULL || pRoot1->val != pRoot2->val) return false;
if (judge(pRoot1->left, pRoot2->left) && judge(pRoot1->right, pRoot2->right))
return true;
}
bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if (pRoot1 == NULL || pRoot2 == NULL) return false;
if (judge(pRoot1, pRoot2))
return true;
else
return hasSubtree(pRoot1->left, pRoot2) | hasSubtree(pRoot1->right, pRoot2);
}
};