/**任何一个结点的值域都比它的右子树小,比它的左子树大,我们叫它二叉搜索树**/
#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");
}
接下来将讨论建立一棵树来判别