BST:
1,若左子树非空,则左子树上所有结点关键字值均小于根结点的关键值
2,若右子树非空,则右子树上所有结点关键字值均大于根结点的关键字值
3,左右子树本身也分别是一颗二叉排序树
源程序
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct BSTNode{
ElemType data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;
//二叉排序树插入
int bst_insert(BiTree &T,ElemType k)
{
if(T==NULL)
{
T=(BiTree)malloc(sizeof(BSTNode));
T->data=k;
T->lchild=NULL;
T->rchild=NULL;
return 1;
}
else if(k== T->data)//插入节点重复,不再插入
return 0;
else if(k< T->data)
return bst_insert(T->lchild,k);
else
return bst_insert(T->rchild,k);
}
//二叉排序树构造
void bst_create(BiTree &T)
{
T=NULL;
ElemType e;
printf("建立二叉排序树,以0结束");
scanf("%d",&e);
while(e)
{
bst_insert(T,e);
scanf("%d",&e);
}
printf("二叉排序树构造成功!");
}
//先序遍历
void pre_traverse(BiTree &T)
{
if(T!=NULL)
{
printf("%d",T->data);
if(T->lchild !=NULL)
pre_traverse(T->lchild);
if(T->rchild!=NULL)
pre_traverse(T->rchild);
}
}
//中序遍历
void mid_traverse(BiTree T)
{
if(T!=NULL)
{
if(T->lchild !=NULL)
pre_traverse(T->lchild);
printf("%d",T->data);
if(T->rchild!=NULL)
pre_traverse(T->rchild);
}
}
//后序遍历
void post_traverse(BiTree &T)
{
if(T!=NULL)
{
if(T->lchild !=NULL)
pre_traverse(T->lchild);
if(T->rchild!=NULL)
pre_traverse(T->rchild);
printf("%d",T->data);
}
}
void main()
{
BiTree T;
bst_create(T);
printf("先序遍历结果:");
mid_traverse(T);
}
结果
建立二叉排序树,以0结束5 4 3 7 9 2 6 0
二叉排序树构造成功!先序遍历结果:4325769