初探二叉搜尋樹

2022-05-02 14:09:07 字數 1651 閱讀 9763

二叉搜尋樹

二叉搜尋樹很明顯來自於一種思想

:二分查詢

二叉搜尋樹

很明顯:

對於二叉搜尋樹而言,有以下典型的操作:

1 插入,刪除

2 查詢

3 遍歷:深度優先遍歷(包括前序,中序,後序三種方式),廣度優先遍歷

對於插入而言:是乙個比較簡單的過程。自己思考**的實現。

刪除操作比較麻煩,先不講

而關於查詢操作嗎,和插入操作差別不大,不講

關於三種深度優先遍歷:其中中序遍歷可以將節點按順序輸出,後序遍歷可以用來銷毀二叉樹(銷毀二叉樹,需要先刪除左子節點,然後刪除右子節點,然後才是根節點。

重點說一下廣度優先遍歷:

對於圖示二叉搜尋樹,明顯廣度優先遍歷的結果是:40,30,50,35,48,52,45.那麼在計算中該如何實現這個東西呢?

其核心思想在於:佇列的使用,如下圖

將根節點40入隊,將40出隊,如果其有左右子節點,將左右子節點依次入隊,再將(左右)子節點出隊,在出隊的時候,檢查該左右子節點是否還有孩子節點,如果有,繼續將孩子節點入隊。

核心在於,每做完一次的出隊操作,都要檢查當前出隊節點是否存在孩子節點,如果有,將孩子節點入隊。直到隊列為空!

下面講解在二叉排序樹中的刪除問題:

上述三張圖給出了二叉排序樹節點刪除的

3種情況:

刪除的節點是葉子節點

刪除的節點只有乙個孩子節點(左孩子或右孩子)

刪除的節點有左右孩子(子樹)

針對情況

1:直接將節點刪除即可

針對情況

2:用刪除節點的孩子節點代替刪除節點

針對情況

3:我們需要考慮其前驅或者後繼節點(前驅節點是

key值上比該節點小的前乙個節點,後繼是

key值比該節點大的後乙個節點)。我們用該節點的前驅節點或者後繼節點替代該節點:例如上圖中我們用

key值為

45的節點或

key值為

52的節點替代

key值為

50的節點。

關於二叉搜尋樹的總結和思考:

二叉搜尋樹的定義已經說明了,它存在的意義就是為了更快速的查詢。使得我們線性表下的

的查詢效率,降低為

。但同時我們應該明白:由於二叉排序樹只是寬泛的說明了節點鍵值的關係,對於樹的結構並沒有嚴格的限制,那麼這樣的樹也可能是非平衡的。這將會導致查詢效率的降低,極端的條件下直接退化為鍊錶。為此,才會有類似於平衡樹這些概念。

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...