描述:
采用二叉链表方式存储二叉排序树。从空树开始,将输入元素按照输入顺序逐个插入一颗二叉排序树,以生成二叉排序树,并输出先序遍历的结果。
输入说明
第一行为整数n,表示将输入n个数字。第二行为n个整数,为输入数据,n个整数间用空格隔开。
输出说明
在一行上输出先序遍历这颗二叉排序树的结果,中间用空格隔开。
输入范例
10
1 8 7 20 4 60 10 100 3 19
输出范例
1 8 7 4 3 20 10 19 60 100
思路
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct BinTNode
{
int data;
struct BinTNode *lchild, *rchild;
}BinTNode, *BinTree;
void CreatSortBinTree(BinTree *T);
void Insert(BinTree *T, int key);
void PreOrderTraverse(BinTree T);
int main()
{
BinTree T = NULL;
CreatSortBinTree(&T);
PreOrderTraverse(T);
return 0;
}
void CreatSortBinTree(BinTree *T) //建立二叉排序树
{
int n, i, key;
scanf("%d", &n);
for(i = 0; i < n; i ++)
{
scanf("%d", &key);
Insert(&(*T), key);
}
}
void Insert(BinTree *T, int key)
{
BinTree p; //新插入的节点
p = (BinTree)malloc(sizeof(BinTNode));
p -> data = key;
p -> lchild = p -> rchild = NULL;
if((*T) == NULL) //根节点为空,插入节点作为根节点
{
*T = p;
return;
}
if((*T) -> lchild == NULL && key < (*T) -> data) //插入到左节点
{
(*T) -> lchild = p;
return;
}
if((*T) -> rchild == NULL && key > (*T) -> data) //插入到右节点
{
(*T) -> rchild = p;
return;
}
if(key < (*T) -> data)
Insert(&(*T) -> lchild, key);
else if(key > (*T) -> data)
Insert(&(*T) -> rchild, key);
else
return;
}
void PreOrderTraverse(BinTree T)
{
if(T)
{
printf("%d ", T -> data);
PreOrderTraverse(T -> lchild);
PreOrderTraverse(T -> rchild);
}
}