二叉搜尋樹(binary search tree)其實就是二叉樹加上乙個條件:對於二叉樹內的每個父節點及其左右子節點,都必須符合左子節點小於父節點,右子節點大於父節點。
typedef
struct node *bst;
struct node
;
因為非遞迴函式執行效率更高,所以我們用迭代函式來實現
bst find
(bst tree,elementtype x)
return
null
;}
根據二叉搜尋樹的特點:對於二叉樹內的每個父節點及其左右子節點,都必須符合左子節點小於父節點,右子節點大於父節點。我們可以知道最小的元素一定是最左側的沒有左子節點的節點,而最大的元素一定是最右側的沒有右子節點的節點。故我們就可以一直向兩側查詢:
bst findmax
(bst tree)
//用遞迴實現找最大元素
bst findmin
(bst tree)
//用迭代實現找最小元素
return
null
;}
插入一定不能破壞二叉搜尋樹的特性:左子節點小於父節點,右子節點大於父節點。
bst insert
(bst tree,elementtype x)
else
else
if(tree-
>dataelse}}
return tree;
}
和二叉樹一樣,向乙個空二叉樹插入元素即可
bst build
(elementtype a,
int n)
return tree;
}
因為不能破壞二叉搜尋樹的特點。
顯然我們要分三種情況討論:
(1)刪除葉子結點:不會影響二叉搜尋樹的特點,顯然直接delete掉那個空間即可。
(2)刪除的結點有乙個子節點:直接讓指向被刪除結點的指標指向它的唯一子節點即可。
(3)刪除的結點有兩個子節點:
這時我們就要分析一下了:因為左子節點小於父節點,右子節點大於父節點,所以被刪除元素左側的最大元素是左子樹中最右側的沒有右子節點的元素,被刪除元素右側的最小元素是右子樹中最左側的沒有左子節點的元素,因為不能破壞二叉搜尋樹的特點,所以要找最接近被刪除節點且符合特點的元素,一定是被刪除元素左側的最大元素和被刪除元素右側的最小元素。
bst delete
(bst tree,elementtype x)
else
}return tree;
}
如果我們一直刪除符合第三種情況的元素,那麼會一直用右子樹中的最小元素代替,會導致數的平衡性很差,我們可以交替使用左子樹的最大元素和右子樹的最小元素,或者用我們之前求二叉樹高度的函式heigh:(在文尾)
隨時記錄當前左右子樹的高度,誰的高度大用誰的。
因為二叉搜尋樹左子節點小於父節點,右子節點大於父節點,也就是左節點《根節點《右節點,那麼我們在中序遍歷(左根右)二叉搜尋樹時得到的是有序序列(從小到大),利用這一性質可以根據需求來搞事情。
二叉搜尋樹 二叉搜尋樹的刪除操作
如圖刪除 7,4,2直接刪除接可以 如圖 刪除6把7拉上去 如圖 刪除3 4沒有左孩子直接返回4 所以最後的結果只是4覆蓋3 上 class solution if key root.val else if key root.val else else if root.right null else...
二叉搜尋樹的操作
一 二叉搜尋樹的概念 1.二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹 1 若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 2 若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值 3 它的左右子樹也分別為二叉搜尋樹 給定值的比較次數等於給定值節點在二叉排...
二叉搜尋樹的實現
binarysearchtree.h inte ce for the binarysearchtree class.include binarytreenode.h include binarytree1.h if defined afx binarysearchtree h 1cd2ff9d 73...