二叉排序樹也被稱為二叉查找樹。它要麽是壹棵空樹;或者是壹棵二叉樹,具有以下性質:(1)如果左子樹不為空,則左子樹上所有節點的值都小於其根節點的值;(2)如果右子樹不為空,則右子樹上所有節點的值都大於其根節點的值;(3)左右子樹也是二叉排序樹;
根據定義,中序遍歷的輸出序列是“節點值從小到大的遞增序列”
代碼參考如下:
#包含?& ltstdio.h & gt
#包含?& ltmalloc.h & gt
typedef?int?KeyType
typedef?struct?節點?//記錄類型
{
KeyType?關鍵;//關鍵字項
struct?節點?*lchild,* rchild?//左右子指針
}?BSTNode
int?InsertBST(BSTNode?* & ampp,KeyType?k)?
{
如果?(p==NULL)//原樹為空。新插入的記錄是根節點。
{
p=(BSTNode?*)malloc(sizeof(BSTNode));
p->;key = k;
p->;l child = p-& gt;rchild = NULL
回歸?1;
}
不然呢?如果?(k = = p-& gt;關鍵)?//樹中有相同關鍵字的節點,返回0。
回歸?0;
不然呢?如果?(k & ltp->;關鍵)?
回歸?insert BST(p-& gt;lchild,k);?//插入到* p的左子樹中。
其他
回歸?insert BST(p-& gt;rchild,k);//插入到* p的右子樹中。
}
BSTNode?*CreateBST(KeyType?A[],int?n)?//返回BST根節點指針。
{
BSTNode?* bt = NULL//最初bt是壹棵空樹。
int?I = 0;
什麽時候?(我& ltn)?
{
InsertBST(bt,A[I]);?//將關鍵字A[i]插入到二叉排序樹t中。
i++;
}
回歸?Bt;//返回已建立的二叉排序樹的根指針。
}
作廢?mid_order(BSTNode?*T)//按中間順序遍歷二叉樹
{
如果(T)
{
中期訂單(T-& gt;l child);
printf("?%d?”,T-& gt;關鍵);
中期訂單(T-& gt;rchild);
}
}
作廢?主()
{
BSTNode?*bt,*p,* f;
int?n = 9;
KeyType?a[]={1,12,5,8,3,10,7,13,9 };
bt=CreateBST(a,n);
printf(" BST:");中期訂單(Bt);printf(" \ n ");
}