输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
首先我们要遍历一遍树,要找到B树跟A树开始的结点,比如下面就要找到2所在的节点位置
找到这个位置后,我们开始对这个节点进行遍历
遍历的结果有三种:
第一种:B树遍历结束了A树还没有,B树是A的子树
第三种:B树还没有结束A树结束,B树不是A树的子树
第二种:B树结束,A树也结束,B树是A树的子树
第四种:B的val不等于A的val,B树不是A的子树
两次递归,太巧妙了。
bool SearchTree(TreeNode *root1,TreeNode *root2)
{
if(root2 == NULL)
{
return true;
}
if(root1 == NULL )
{
return false;
}
if(root1->val != root2->val)
{
return false;
}
return SearchTree(root1->left,root2->left) &&
SearchTree(root1->right,root2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool flag=false;
if(pRoot1 != NULL && pRoot2 != NULL)
{
if(pRoot1->val == pRoot2->val)
{
flag = SearchTree(pRoot1,pRoot2);
}
if(!flag)
{
flag = HasSubtree(pRoot1->left,pRoot2);
}
if(!flag)
{
flag = HasSubtree(pRoot1->right,pRoot2);
}
}
return flag;
}