在實際生產中,一棵二叉搜尋樹的平均深度是log(n),所以通常是遞迴的編寫二叉樹的操作**,不需要太擔心爆棧的問題。
對二叉樹的所有操作,無非就是從根節點、左子樹、右子樹這三者中入手,分析基本的、可能的情況後,再遞迴的編寫相應的操作即可。
我們的重點放在insert()操作和**delete()**操作中。
insert()
首先,我們需要先定義insert()函式,它的作用是將乙個新元素新增到bst中,然後返回插入新元素後的bst。
如何將新元素插入到一棵bst中。我們從根節點、左子樹、右子樹這三者中入手。
根節點:根節點為空(為空樹),直接將該新元素新增到樹中。
左子樹:比根節點小,新增到左子樹中。
右子樹:比根節點大,新增到右子樹中。
searchtree
insert
( elementtype x , searchtree t )
else
if( x < t->element )
else
if( x > t->element )
return t;
}
delete()
delete()的作用是在給定的bst中刪除乙個目標元素,並返回刪除後的bst
1.刪除操作依然從根節點左子樹、右子樹這三者中入手。
2.根節點:當前節點即為目標節點。有三種情況:
a.該節點是樹葉,直接刪除。
b.該節點有乙個兒子。
c.該節點有兩個兒子。
3.左子樹:待刪除的節點在左子樹中,在左子樹中刪除。
4.右子樹:待刪除的節點再右子樹中,在右子樹中刪除。
接下來,再具體分析:
1.樹葉節點:待刪除的節點是樹葉,直接刪除。
2.乙個兒子:將指向該節點的指標調整為指向該節點的兒子節點。
3.兩個兒子:在 x 的右子樹中尋找乙個最小元素min,使用min代替 x ,然後刪除min,因為右子樹中的最小的節點 x 不可能有左兒子,所以第二次delete()更容易,也就是刪除只有乙個兒子的情況
searchtree
delete
( elementtype x , searchtree t )
else
return t;
}
總結 :對二叉樹的刪除操作是在分析基本情況後,將不符合基本情況的轉換為基本情況,最後得到答案。需要注意的是遞迴函式是返回一棵刪除後的子樹。 二叉搜尋樹 增刪查
性質 每個節點的key值各不相同 左子樹上所有節點的key值小於根結點 右子樹上的所有節點key值大於根結點 左右子樹都是二叉搜尋樹 insert插入 bool insert const k key 非遞迴插入 node cur root node parent null while cur els...
二叉搜尋樹的增刪改查
二叉搜尋樹 binary search tree 簡稱 bst,是一種特殊形式的二叉樹。二叉搜尋樹的的結構有兩種可能 對於二叉搜尋樹,需要掌握基本的操作 當要查詢目標值的節點時,我們可以根據二叉樹的結點資料值的有序性 左孩子 根結點 右孩子 根據以下思路進行查詢 簡單實現 返回以目標值結點為根結點的...
二叉查詢樹(增 刪 查)
原理 按照大的向右小的向左原則,沿著樹的根節點往下找,找到第乙個為空的節點或者節點的key和目標key相同時結束,前者插入,後者替換。description 插入節點 param key param value author wjc920 date 2018年6月26日 public void pu...