二叉排序树是一种左子树的值小于根,而右子树的值大于根的的一棵树,通过中序遍历可以得到一个有序的序列= =
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct node
{
int data;
struct node *left,*right;
}binode ,*bitree;
bool find(bitree T,int k,bitree f,bitree &p)//查找函数,在T树找查找k是否存在,f表示T的双亲节点,p用来指向查找路径中的最后一个节点
{
if(T==NULL)
{
p=f;
return false;
}
else if(k==T->data)
{
p=T;
return true;
}
else if(k<T->data)
return find(T->left,k,T,p);
else
return find(T->right,k,T,p);
}
int insert(bitree &T,int k)
{
bitree s,p;
if(!find(T,k,NULL,p))//查找k是否在树中存在
{
s=(bitree)malloc(sizeof(binode));
s->data=k;
s->left=s->right=NULL;
if(p==NULL)//若p==NULL,则说明现在的树是一颗空树,说明s为根节点
T=s;
else if(k<p->data)//k<p->data说明s节点应该放在p的左子树 ,反之则放在右子树
p->left=s;
else
p->right=s;
return 0;
}
return 1;
}
void visit(bitree T)
{
if(T!=NULL)
{
printf("%d ",T->data);
}
}
void midvisit(bitree T)
{
if(T!=NULL)
{
midvisit(T->left);
visit(T);
midvisit(T->right);
}
}
int main()
{
int n,k,i;
scanf("%d",&n);
bitree T;
T=NULL;
for(i=0;i<n;i++)
{
scanf("%d",&k);
insert(T,k);
}
midvisit(T);
return 0;
}