二叉搜尋樹

2021-07-22 18:41:21 字數 2297 閱讀 3464

二叉搜尋樹是在二叉樹的基礎上的根據子樹的值的大小進行了排序調整後的結果,而且它是紅黑樹的基礎結構,在了解紅黑樹之前學習二叉搜尋樹對後面掌握紅黑樹是有很大幫助的。

二叉樹的任意結點,它的左子樹關鍵字不超過父結點,右子樹關鍵字不小於父結點,則這樣的二叉樹成為二叉搜尋樹。

node search(node node,int

value)

if(node.value==value)

if(value

value)

if(value>node.value)

}

非遞迴版本**:

node search(node node,int

value)

while(node.value!=value&&node!=null)

if(value>node.value)

}return node;

}

二叉搜尋樹的插入操作和查詢很類似,直接看**

遞迴版插入偽**:

void insert(node node,int

value)else

}return;

}if(value>node.value)

if(value

value)

}

非遞迴的**

void insert(node node,int

value)

while(node!=null)else

}if(temp.value>value)else

}

二叉查詢樹的刪除分三種情況考慮(假設要刪除的結點是z):

如下圖所示:

後繼結點是指二叉查詢樹中從小到大排序後,排在刪除結點的後乙個的結點,也就是中序遍歷時,訪問刪除結點後下乙個要訪問的結點,所以訪問z之後,再訪問z的右子樹,如果右子樹的左子樹為空,則訪問右子樹的根結點,否則訪問右子樹的最左子結點。所以說第三種刪除情況又分為兩種情況:圖(a)中,y代替z,z原來的左子樹成為y的左子樹,y原來的右子樹仍作為y的右子樹,z結點刪除;圖(b)中,y結點代替z結點,z原來的左子樹作為y的左子樹,y原來的 右子樹作為y原來的父結點的左子樹,z結點刪除。

可以看到,四種情況下,都包含有將某個節點的整個子樹替換原來的結點操作(第一種情況可理解成空子樹替換原來的結點)。先給出某結點替換另一結點的統一操作注意,替換操作,只是調整了old點的父結點,並沒有調整new點的左右子樹指向old點左右指數,因為四種情況,子樹的調整上並不完全統一

void replace(node root,node old,node new)

if(old.p.lchild!=null)else

if(new!=null)

}

從上述**看出,old為root結點,new為null結點等特殊情況下,均可以實現new替換old的操作。

有了replace方法,我們寫delete方法就方便了,**如下:

void

delete(node root,node z)

if(z.lchild==null&&z.rchild==null)else

if(z.lchild==null&&z.rchild!=null)else

if(z.rchild=null&&z.lchild!=null)else

if(y.p==z)else

//關於中繼結點對應的if/else,可以優化成

// if(y.p!=z)

// replace(root,z,y);

// y.lchild=z.lchild;//調整y新的左子樹

// y.lchild.p=y;

//博主個人覺得不優化的時候適合初學者理解,理解了之後再優化成這樣,也是好理解的。}}

優化的過程相當於下圖所示:

圖(a)表示第三種情況的第一種可能,圖(b)表示第三種情況的第二種可能。此時可以將圖(b)的中繼結點先調整到位,構成圖(a)的樣子,然後再和圖(a)一樣replace(root,z,y),所以如果第二種情況,就多執行如下幾步即可。

if(y.p!=z)

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...