1. 程式人生 > >[樹]二叉排序樹的建立與先序遍歷

[樹]二叉排序樹的建立與先序遍歷

描述:

採用二叉連結串列方式儲存二叉排序樹。從空樹開始,將輸入元素按照輸入順序逐個插入一顆二叉排序樹,以生成二叉排序樹,並輸出先序遍歷的結果。

輸入說明

第一行為整數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); } }