题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:第一步,首先找到A中与B根结点相等的结点node。
第二部,判断以node为根结点的子树与B是否相等。
代码:
class Solution {
public:
// 判断pRoot2是否是pRoot1的子结构(两个树根结点不一定相同,需要先判断根结点)
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL||pRoot2==NULL)
return false;//
bool res=false;
if(pRoot1->val==pRoot2->val)
res= DoesTree1HaveTree2(pRoot1,pRoot2);
if(!res)//如果当前结点不等,则判断其左子树
res= HasSubtree(pRoot1->left,pRoot2);
if(!res)//左子树不等判断其右子树
res=HasSubtree(pRoot1->right,pRoot2);
return res;
}
//判断root2是否是root1的子结构(两个树根结点相同)
bool DoesTree1HaveTree2(TreeNode* root1,TreeNode* root2)
{ if(root2==NULL)//这句必须在if(root1==NULL)的前面,不然会出错
return true;
if(root1==NULL)
return false;
if(root1->val!=root2->val)
return false;
return DoesTree1HaveTree2(root1->left,root2->left)&&DoesTree1HaveTree2(root1->right,root2->right);
}
};
总结:递归的方法,如何正确的递归,参照以上两个函数。思考递归结束条件是什么。
延伸:如何判断两个树结构是否相等。可以利用判断一颗二叉树是否对称中调用的函数。即下面的函数。
与 //判断root2是否是root1的子结构(两个树根结点相同)
中不同的是,不能用
if(root2==NULL)
return true;
if(root1==NULL)
return false;
作为递归终止条件。
应该用:
if (root1 == NULL&&root2 == NULL)
return true;
if (root1 == NULL||root2 == NULL)
return false;
代码:
//判断树root2与树root1是否相等
bool DoesTree1HaveTree2(TreeNode* root1, TreeNode* root2)
{
if (root1 == NULL&&root2 == NULL)
return true;
if (root1 == NULL||root2==NULL)
return false;
if (root1->val != root2->val)
return false;
return DoesTree1HaveTree2(root1->left, root2->left) && DoesTree1HaveTree2(root1->right, root2->right);
}