[樹]二叉排序樹的建立與先序遍歷
阿新 • • 發佈:2019-02-10
描述:
採用二叉連結串列方式儲存二叉排序樹。從空樹開始,將輸入元素按照輸入順序逐個插入一顆二叉排序樹,以生成二叉排序樹,並輸出先序遍歷的結果。
輸入說明
第一行為整數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);
}
}