二叉搜尋樹
二叉搜尋樹很明顯來自於一種思想
:二分查詢
二叉搜尋樹
很明顯:
對於二叉搜尋樹而言,有以下典型的操作:
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 解釋 輸入為 ...