判别两序列所对应两颗二叉搜索树是否相同之建立两颗树4.13

/**任何一个结点的值域都比它的右子树小,比它的左子树大,我们叫它二叉搜索树**/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
typedef int Ele;
typedef struct Node{
Ele e;
struct Node *left;
struct Node *right;
}*Tree,*TNode;
//
Tree insert(Tree t,Ele e){
if(t==NULL){
t=(TNode)malloc(sizeof(struct Node));
t->e=e;
t->left=NULL;
t->right=NULL;

}else if(t->e>e)
t->left=insert(t->left,e);
else if(t->e<e)
t->right=insert(t->right,e);
//printf("%d\n",t->e);

return t;

}
void print(Tree t,int *n){//n为计算结点数
	if(t){
printf("%d ",t->e );(*n)++;
print(t->left,n);
print(t->right,n);
}
}

int HTree(Tree t){
int tmp,hl,hr;
if(t==NULL)
return 0;
hl=HTree(t->left);
hr=HTree(t->right);
tmp=hl>hr?hl:hr;
return tmp+1;
}


TNode findmin1(Tree t){
if(!t)
return NULL;
else if(t->left==NULL)
return t;
else 
return findmin1(t->left);//t->left=findmin1(t->left);尾递归都可以变为迭代,如findmin
}





TNode findmin(Tree t){//找到最小值
if(t){
while(t->left)
	t=t->left;
}
return t;
}

TNode find(Tree t ,Ele e){
if(!t)
return NULL;
else if(e<t->e)
return find(t->left,e);
else if(e>t->e)
return find(t->right,e);
else 
return t;
}




//2017年04月02日06:36:19
Tree delete(Tree t,Ele e){
	Tree tmp;
	if(t==NULL)
		;
	else if(t->e>e)
		t->left=delete(t->left,e);
	else if(t->e<e)
		t->right=delete(t->right,e);//内层函数的返回值赋给了外层,即它的右子树根节点的地址赋值给了它的右指针
	else{
			if(t->left!=NULL&&t->right!=NULL)//删除结点有两个儿子
         	{tmp=findmin(t->right);
         		t->e=tmp->e;
         		t->right=delete(t->right,tmp->e);
         	}
			else{//删除的结点无子结或右一个儿子结点
				if(t->left!=NULL)
				{tmp=t;
					t=t->left;//可能此时t在内层的内层的某个delete函数里
				}
                 else if(t->right!=NULL)
                 {
                 	tmp=t;
					t=t->right;

                 }
                 free(tmp);
			}
	}
return t;//返回此树的根结点指针(地址)
}



bool isone(Tree a,Tree b){
if(!a&&!b)
	return true;
else if(a&&!b||!a&&b)
	return false;
else if(a->e!=b->e)
	return false;
else if(a->e==b->e)
return isone(a->left,b->left)&&isone(a->right,b->right);




}

bool isone1(Tree a,Tree b){
if(!a&&!b)
	return true;
else if(a&&!b||!a&&b)
	return false;
else if(a->e!=b->e)
	return false;
else if(a->e==b->e)
{
if(!a->left&&!b->left&&!a->right&&!b->right)
	return true;
else
return isone(a->left,b->left)&&isone(a->right,b->right);


}

}
//isone1比isone效率高一点,当a->e==b->e 且(!a->left&&!b->left&&!a->right&&!b->right)时one1就return了,而isone
//要继续递归化为其它更简单的情况,
bool isone2(Tree a,Tree b){
if(!a&&!b)
	return true;
else if(a&&!b||!a&&b)
	return false;
else if(a->e!=b->e)
	return false;
else if(!a->left&&!b->left)//执行到这说明a->e==b->e,左子树相同只需判断右子树是否相同
	return isone2(a->right,b->right);
else if(a->left&&b->left&&a->left->e==b->left->e)
	return isone2(a->left,b->left)&&isone2(a->right,b->right);
else //包括if(a->left&&b->left&&a->left->e!=b->left->e),if(!a->left&&b->left)等等
    return false;

}

int main(int argc, char const *argv[])
{

srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
	/* code */

Tree t=NULL;
Tree t1=NULL;
Tree t2=NULL;
int  number=0;
for(int i=0;i<10000;i++){
number = rand() % 101;  //产生0-100的随机数

t=insert(t,number);
t1=insert(t1,number);
t2=insert(t2,number);
}
//t2=insert(t2,3);//可能之前就存在3这个结点了导致插不进去
t2=insert(t2,103);
if(isone2(t,t1))
	printf("t与t1同一颗树\n");
else
	printf("t与t1 butong\n");
if(isone2(t,t2))
	printf("t与t2 同一颗树\n");
else
	printf("t与t2 butong\n");

}

接下来将讨论建立一棵树来判别


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值