二叉排序树与快排的思想差不多,只不过这里用到了二叉树的数据结构。对于这个二叉树满足,每个节点都满足左子树每个值都比它小,右子树每个值都比它大。这样,中序遍历这个树就可以得到升序结果。
这里可以看出,关键问题是,怎么把一个结点插入到他应该在的位置,实现二叉排序树的构建过程。用到的是一个递归操作。代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define newp (tree*)malloc(sizeof(tree)) //申请地址的宏定义 5 6 typedef struct _tree{ 7 int data; 8 struct _tree *l,*r; //树结点类型 9 }tree; 10 11 void insert(tree ** newroot,tree* s) //插入一个结点的函数 12 { 13 if (*newroot==NULL) (*newroot)=s; 14 else{ 15 if ((*newroot)->data<(s->data)) insert(&((*newroot)->r),s); 16 if ((*newroot)->data>(s->data)) insert(&((*newroot)->l),s); 17 } 18 } 19 20 void inorder(tree * newroot) //中序遍历 21 { 22 if (newroot!=NULL) 23 { 24 inorder(newroot->l); 25 printf("%d ",newroot->data); 26 inorder(newroot->r); 27 } 28 } 29 30 int main() 31 { 32 int n,i,x; 33 tree * root=NULL,*s; 34 scanf("%d",&n); 35 for (i=0;i<n;i++) 36 { 37 scanf("%d",&x); 38 s=newp; 39 s->data=x; 40 s->l=NULL; 41 s->r=NULL; 42 insert(&root,s); 43 } 44 inorder(root); 45 return 0; 46 }