判断树B是不是树A的子结构。如下图,右边的树就是左边树的子结构。
测试用例:
功能测试:A,B都是普通二叉树,B是或不是A的子结构
特殊值测试:一个或两个树的根节点是空指针,A或者B或两个都是没有左孩子或右孩子的树
#include<iostream>
#include<string.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* Lnode;
TreeNode* Rnode;
TreeNode(int i=0)
{
val=i;
Lnode=nullptr;
Rnode=nullptr;
}
};
bool root1hasroot2(TreeNode* root1,TreeNode* root2)
{
if(root2)return true;
if(!root1)return false;
if(root1->val!=root2->val)
return false;
return root1hasroot2(root1->Lnode,root2->Lnode)&&root1hasroot2(root1->Rnode,root2->Rnode);
}
bool Traverse(TreeNode* root1,TreeNode* root2)
{
bool f=false;
while(root1&&root2)
{
if(root1->val==root2->val)
f=root1hasroot2(root1,root2);
if(!f)
f=Traverse(root1->Lnode,root2);
if(!f)
f=Traverse(root1->Rnode,root2);
}
return f;
}
特别要注意root1hasroot2函数中,if的判断顺序不能乱,一定要先判断root2是否为空,为空则正确,再判断root1是否为空,root1和root2的值是否相等。