二叉树排序的基本原理:先构建一颗空树,使用第一个元素作为根节点,如果之后的元素比第一个小,则放到左子树,否则放到右子树,之后按中序遍历。
时间复杂度:nlog2(n)
空间复杂度:中序遍历时,需要构建栈,为logn.
二叉搜索树的性质:
(1)每个结点都有一个作为搜索依据的关键码(key)也就是数据域,所有节点的关键码互不一样。
(2)左子树(如果存在)上的所有结点的关键码都小于根结点的关键码。
(3)右子树(如果存在)上的所有结点的关键码都大于根结点的关键码。
(4)左右子树也是二叉搜索树。
代码:
#include "StdAfx.h"
#include<stdio.h>
#include<malloc.h>
#define STACK_INCREMENT 10
#define STACK_INIT_SIZE 100
#define MAXSIZE 50
//二叉排序树的链式存储结构
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//栈的顺序存储结构
typedef struct
{
BiTree *base;
BiTree *top;
int stacksize;
}Sqstack;
//初始化一个栈,用于二叉树的中序遍历
void InitStack(Sqstack&S)
{
S.base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
if(!S.base)
exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
//二叉排序树查找
void SearchBST(BiTree T,int key,BiTree f,BiTree&p)
{
if(!T)
p=f;
else if(T->data==key)
p=T;
else if(T->data<key)
SearchBST(T->rchild,key,T,p);
else
SearchBST(T->lchild,key,T,p);
}
//创建一个二叉排序树
void CreatBST(BiTree &T,int e)
{
BiTree p,s,q;
SearchBST(T,e,NULL,p);//找到带插入的位置。
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=NULL;
s->rchild=NULL;
if(!p)T=s;
else if(e==p->data)//当待排序列中有相同的元素时,将其放在相同元素的右孩子位置。原来的右子树放在其右节点域。
{
q=p->rchild;
p->rchild=s;
s->rchild=q;
}
else if(e<p->data)
p->lchild=s;
else
p->rchild=s;
}
//中序遍历二叉排序树
void InOrderTravese(BiTree T)
{
BiTree p;
Sqstack Sqt;
InitStack(Sqt);
p=T;
while(p||Sqt.base!=Sqt.top)
{
if(p)
{
if(Sqt.top-Sqt.base>=Sqt.stacksize)
{
Sqt.base=(BiTree*)realloc(Sqt.base,(Sqt.stacksize+STACK_INCREMENT)*sizeof(BiTNode));
if(!Sqt.base)
exit(OVERFLOW);
Sqt.top=Sqt.base+Sqt.stacksize;
Sqt.stacksize+=STACK_INCREMENT;
}
*Sqt.top++=p;
p=p->lchild;
}
else
{
p=*--Sqt.top;
printf("%d ",p->data);
p=p->rchild;
}
}
printf("\n");
}
void main()
{
int length;
int bst[MAXSIZE];
BiTree BST;
BST=(BiTree)malloc(sizeof(BiTNode));
BST=NULL;
printf("***************************\n");
printf(" 二叉树排序算法 \n");
printf("***************************\n");
printf("请输入待排序序列的个数N (N<%d):",MAXSIZE);
scanf("%d",&length);
printf("\n");
printf("请输入待排序的关键字:\n");
for(int i=0;i<length;i++)
scanf("%d",&bst[i]);
printf("\n");
for(int i=0;i<length;i++)
CreatBST(BST,bst[i]);
printf("输出二叉树排序结果:\n");
InOrderTravese(BST);
printf("\n");
free(BST);
}