二叉树排序算法

08月09日 收藏 0 评论 7 java开发

二叉树排序算法

转载声明:文章来源https://blog.csdn.net/qq_40803710/article/details/80945367

二叉树排序的基本:先构建一颗空树,使用第一个元素作为根节点,如果之后的元素比第一个小,则放到左子树,否则放到右子树,之后按中序遍历。

时间复杂度:nlog2(n)
空间复杂度:中序遍历时,需要构建栈,为logn.

二叉搜索树的性质:

(1)每个结点都有一个作为搜索依据的关键码(key)也就是数据域,所有节点的关键码互不一样。

(2)左子树(如果存在)上的所有结点的关键码都小于根结点的关键码。

(3)右子树(如果存在)上的所有结点的关键码都大于根结点的关键码。

(4)左右子树也是二叉搜索树。

代码:

#include "StdAfx.h"
#include
#include
#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 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(edata)
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 scanf("%d",&bst[i]);
printf("\n");
for(int i=0;i CreatBST(BST,bst[i]);
printf("输出二叉树排序结果:\n");
InOrderTravese(BST);
printf("\n");
free(BST);
}
C 7条回复 评论
招招

中枪,我脑子里全是错误回答

发表于 2023-10-03 22:00:00
0 0
岸然

不错

发表于 2022-02-21 21:00:00
0 0
小邪

收藏不息,战斗不止

发表于 2021-12-08 14:40:00
0 0
半个朋友

收藏从未停止,学习从未开始

发表于 2021-09-10 18:20:00
0 0
梁利晖

又搞定一个知识盲区

发表于 2021-09-10 14:55:00
0 0
卫澜

懂了懂了

发表于 2021-09-09 11:45:00
0 0
已註銷

在大学没有那么优秀的经历怎么办

发表于 2021-09-08 22:35:00
0 0