题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=34
//九度OJ 教程35 排序二叉树的建立与遍历。
//http://ac.jobdu.com/problem.php?cid=1040&pid=34
#include <stdio.h>
typedef struct tt{
int data;
struct tt *l,*r;
}tt,*tp;
void LNR(tt *root);
void LRN(tt *root);
void NLR(tt *root);
void tfree(tt *root)
{
if(root==NULL)return;
tfree(root->l);
tfree(root->r);
free(root);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
tp root=(tt *)malloc(sizeof(tt));
tp p=NULL,q2=NULL,q1=NULL;
int i,j,k,flag;
scanf("%d",&(root->data));
root->l=root->r=NULL;
for(i=1;i<n;i++)
{
flag=1;
q1=NULL;
q2=root;
p=(tt *)malloc(sizeof(tt));
p->l=p->r=NULL;
scanf("%d",&(p->data));
while(q2!=NULL)
{
if(p->data==q2->data)//若存在相等的元素,设置flag=0,然后直接break
{
flag=0;
break;
}
if(p->data>q2->data)
{
q1=q2;
q2=q2->r;
}
else
{
q1=q2;
q2=q2->l;
}
}
if(flag)//若存在相等的元素,直接忽略掉,free()就好了。
{
if(p->data>q1->data){q1->r=p;}
else q1->l=p;
}
else free(p);
}
NLR(root);
printf("\n");
LNR(root);
printf("\n");
LRN(root);
printf("\n");
tfree(root);
}
return 0;
}
void LNR (tt *root)
{
if(!root)return;
LNR (root->l);
printf("%d ",root->data);
LNR (root->r);
}
void LRN (tt *root)
{
if(!root)return;
LRN(root->l);
LRN(root->r);
printf("%d ",root->data);
}
void NLR(tt *root)
{
if(!root)return;
printf("%d ",root->data);
NLR(root->l);
NLR(root->r);
}