二叉搜索树的创建和比较

以下代码为普通二叉树的创建和两个二叉树的比较算法,两个算法的思想都是递归思想,在下面代码中,我会具体注释为什么这么写。
#include
#include
#include
using namespace std;
struct Tree
{
int data;
struct Tree *left,*right;//左子树和右子树
};
void create(struct Tree *&T,int key)
{
if(T == NULL)//二叉树在创建时,一定是从根开始遍历每一个节点,所以只有当节点为空时才进行赋值操作。
{
T = (struct Tree *)malloc(sizeof(struct Tree));//节点为空就一定要先申请地址在进行操作
T->data = key;//赋值
T->left = T->right = NULL;
}
else
{//当节点不为空时,就面临着到底是往左走还是往右走,这里需要声明,二叉搜索树左子树一定小于双亲,右子树一定大于双亲,可以发现,当前的T一定是一个双亲节点,那么我们通过在对此节点的比较中就可以找出左右方向
if(keydata)
create(T->left,key);//这里就是递归思想,我们不知道子树是否为空,所以不直接赋值,直接递归调用,此句为创建树的核心语句
else
create(T->right,key);
}
}
int compare(struct Tree *t1,struct Tree *t2)
{
if(t1 == NULL && t2 == NULL)//如果两棵树都是空的,那么我们直接返回1
return 1;
if(t1&&t2)//如果金有一颗是空,那么我们返回0
if(t1->data == t2->data)//判断根(此结点)是否相同
if(compare(t1->left,t2->left)&&compare(t1->right,t2->right)//当前结点相同之后,一定要判断左右子树是否相同,另外,要从此结点同时向左右寻找左右子树
return 1;
return 0;
}
int main()
{
struct Tree *t1,*t2;
int N,L,i;
int a;
while(scanf("%d",&N)&&N)
{
if(N==0)
return 0;
cin>>L;
t1 = NULL;
for(i = 0; i < N; i++)
{
cin>>a;
create(t1,a);//遍历树的重心在:每次遍历一定要从根开始遍历
}
while(L–)
{
t2 = NULL;
for(i = 0;i < N; i++)
{
cin>>a;
create(t2,a);
}
if(compare(t1,t2))
cout<<“Yes”<<endl;
else
cout<<“No”<<endl;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值