问题
如何实现二叉排序树
问题描述
平衡二叉树定义:
平衡二叉树是一颗二叉树,若根节点的左子树不为空,那么左子树的所有结点数据信息小于根节点的数据信息,若根节点的右子树不为空,则右子树所有节点的数据信息大于根节点的数据信息。
算法分析
- 定义一个数组存放数据信息。
- 依次将数据信息存放到二叉树结点的数据域内。
- 如果平衡二叉树不存在,则第一个结点作为该平衡二叉树的根节点,否则与根节点进行比较,若该数据信息大于根节点的数据信息,则与根节点的右孩子进行比较,并插入到右子树中,若该数据信息小于根节点的数据信息,则与根节点的左孩子进行比较,并插入左子树中。
- 这是一个递归过程
代码实现
#include<stdio.h>
#include<stdlib.h>
#define M 50
typedef struct BinBTREE
{
int data;
struct BinBTREE *lchild;
struct BinBTREE *rchild;
}BTNod,*BTREE;
void postorder(BTREE T) //使用了中序遍历,可以使排序二叉树顺序
{
if (T != NULL)
{
postorder(T->lchild);
printf("%3d", T->data);
postorder(T->rchild);
}
}
void intset(BTREE *t, int item) //将数组中的每一个数据,传送到这个插入函数中,进行插入
{
BTREE p, q;
p = (BTREE)malloc(sizeof(BTNod));
p->data = item;
p->lchild = NULL;
p->rchild = NULL;
if (*t == NULL) //若为空则,则它做为根节点
*t = p;
else
{
q = *t;
while (1)
if (item < q->data)
if (q->lchild != NULL) //比根节点小,而且左子树不为空,将左孩子结点作为下一次比较的根节点
q = q->lchild;
else //比根节点小,而且左子树为空,则直接插入到左孩子节点上,并退出循环
{
q->lchild = p;
break;
}
else
if (q->rchild != NULL) //比根节点大,而且右子树不为空,将右孩子结点作为下一次比较的根节点
q = q->rchild;
else //比根节点大,而且右子树为空,则直接插入到右孩子节点上,并退出循环
{
q->rchild = p;
break;
}
}
}
BTREE num(int k[], int n) //依次将数组中的数据信息传送到 insert() 函数中,进行插入。并返回创建的二叉树根节点地址
{
BTREE T = NULL;
if (n > 0)
for (int i = 0; i < n; i++)
intset(&T, k[i]);
return T;
}
void main(void)
{
BTREE T;
int k[M] = { 6,9,8,5,6,3,4 };
T=num(k, 7);
postorder(T);
}
运行结果:
嗝~