我們在上一篇部落格中講解了二叉樹,這一次我們來實現二叉樹的高階——二叉查詢樹(binary search tree),又稱二插排序樹(binary sort tree)。所以簡稱為bst。二插查詢樹的定義如下:
1.若左子樹不為空,則左子樹上所有節點的值均小於它的根節點的值;
2.若右子樹不為空,則右子樹上所有節點的值均大於它的根節點的值;
3.左右子樹也分別為二叉排序樹;
二叉排序樹的乙個重要特點就是中序遍歷是乙個遞增序列。
(1)節點的構造
typedef int elemtype;
typedef struct btnodebitnode,*bitree;(2)建立二叉樹
建立二插排序樹的過程就是乙個不斷插入節點的過程,並且最重要的就是查詢插入的合適位置。
//建立二叉查詢樹
/** * 輸入-1時建立結束,其實是乙個不斷插入的過程
*/int createbinarysearchtree(bitree *t)
printf("%s函式執行,二叉查詢樹建立成功\n",__function__);
return 1;
}(3)插入節點//插入節點
void insert(bitree *t,int x)
if ((*t)->lchild == null && x < (*t)->data)
if ((*t)->rchild == null && x > (*t)->data)
//遞迴實現
if (x < (*t)->data)
if (x > (*t)->data)
return;
}(4)樹的中序遍歷和先序遍歷
樹的先序遍歷+中序遍歷可以唯一的確定一棵樹。並且二叉排序樹的中序遍歷必定是乙個遞增的序列。用這樣的方法可以來驗證我們對一顆二叉排序樹進行操作後是否正確。
//中序遍歷二叉查詢樹
//列印的應該是乙個遞增的序列
void middleorder(bitree t)else
}//先序遍歷二叉查詢樹
//因為先序遍歷+中序遍歷 可以唯一確定一棵樹,等下可以驗證樹是否正確
void preorder(bitree t)else
}(5)查詢元素//查詢某乙個值
//返回1表示找到該值,返回0表示沒有找到
bitnode *searchvalue(bitree t,int x)elseelse if (x > t->data)else
}return null;
}(6)刪除元素//刪除某乙個元素
bitree *deletevalue(bitree *t,int x)
if (x < searchnode->data) else if (x > searchnode->data)else
}if (searchnode->lchild == null && searchnode->rchild == null) elseelse
free(searchnode);
searchnode = null;
}return t;
}if (searchnode->lchild != null && searchnode->rchild == null) else
free(searchnode);
searchnode = null;
return t;
}if (searchnode->lchild == null && searchnode->rchild != null) else
free(searchnode);
searchnode = null;
return t;
}if (searchnode->lchild != null && searchnode->rchild != null)
//這裡要判斷nextnode節點和nextparentnode節點的值大小,因為需要判斷要刪除節點是父親的左孩子還是右孩子
if (nextnode->data < nextparentnode->data) else
//代替值
searchnode->data = nextnode->data;
//刪除後繼節點
free(nextnode);
nextnode = null;
return t;
}return t;
}(7)測試**
int main(int argc, const char * ar**)
二叉查詢樹(BST)及其C語言實現
對任何節點x,其左子樹中的關鍵字最大不超過key x 右子樹中的關鍵字最小不小於key x 二叉查詢樹這種資料結構,它支援多種動態集合操作,search,minimum,maximum,predecessor 前驅 successor 後繼 insert以及delete。在二叉查詢樹上執行的基本操作...
二叉查詢樹C語言實現
二叉查詢樹c語言實現 1.二叉查詢樹的定義 左子樹不為空的時候,左子樹的結點值小於根節點,右子樹不為空時,右子樹的結點值大於根節點,左右子樹分別為二叉查詢樹 2.二叉查詢樹的最左邊的結點即為最小值,要查詢最小值,只需遍歷左子樹的結點直到為空為止,同理,最右邊的結點結尾最大值,要查詢最大值,只需遍歷右...
二叉查詢樹 C語言實現
二叉查詢樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉查詢樹。在使用遞迴的時候,假如函式有返回值,記得接收返回值,並且保證函式在每個板塊結束後都有return,以防出錯。具體見find ins...