二叉搜尋樹 java實現

2021-08-19 18:45:30 字數 2573 閱讀 8503

目錄

1 .插入元素思想與實現

2 .刪除元素思想與實現

3 .完整**

二叉搜尋樹定義

二叉搜尋樹,也稱有序二叉樹,排序二叉樹,是指一棵空樹或者具有下列性質的二叉樹:

若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

任意節點的左、右子樹也分別為二叉查詢樹。

沒有鍵值相等的節點。

構造節點:

class

node

extends

comparable>

public node(int key, t val)

}

二叉搜尋樹插入

插入的過程是:比較當前結點,如果小於當前結點,就往左子樹查詢。如果大於當前結點,就往右子樹查詢。直到查詢的子樹為空樹的時候,就是其插入的位置。

private

void

insertkv(int key, t val)

node cur = root;

node parent = root;

boolean isleftnode = true;

while (cur != null) else

}node newnode = new node(key, val);

if (isleftnode) else

}

二叉搜尋樹的刪除

刪除應該屬於二叉搜尋樹中最複雜的情況了。

有對應4種情況:

1.1 先將當前結點定位到要刪除的節點

/**

* 找到要刪除的節點,並把當前結點定位到要刪除的節點

*/while (cur.key!=key)else

if(cur == null)

}

1.2.1 刪除葉子節點

if(cur.left == null&&cur.right==null)

else

if(isleftchild)else

}

1.2.2 刪除元素只有右孩子

else

if(cur.left == null)else

if(isleftchild)else

}

1.2.3 刪除元素只有左孩子

else

if(cur.right == null)else

if(isleftchild)else

}

1.2.4 刪除的元素既有左孩子,又有右孩子

else 

else

if(isleftchild)

else

//將刪除節點的左子樹接到旋好的樹的左子樹上

successor.left = cur.left;

}/**

* 將要刪除節點為根節點的樹

* 進行旋轉操作

*@param delnode 要刪除的節點

*@return 旋好的子樹

*/private nodegetsuccessor(node delnode)

if(successor!=delnode.right)

return successor;

}

刪除18節點,**執行過程。經過旋轉結果的到以18為根的樹變成了右圖,虛線是轉完之後接上18的左子樹

同樣是刪除18節點,18的子樹變複雜了,轉後的子樹如右

看了這幾張轉後的,可以知道我旋轉子樹的思想。

首先看刪除節點的右子樹,如果為空,就把該節點的右孩子節點往上提一層。

如果右子樹不為空,在看右子樹的左子樹,如果左子樹為空,把整個右子樹往上提一層。

如果右子樹的左子樹不為空,且左子樹沒有孩子節點的時候,直接把右子樹的左子樹提到要刪除節點的位置

有左孩子的時候,像以上的迴圈就可以,直到左孩子為空,迴圈停止。

以上是我個人的實現時的理解方式。大致可以對比這幾張圖,就能達到理解的目的。

注意:旋轉實現,只要能保證二叉搜尋樹的特點,定義就可以。旋轉也不只是一種實現方式。

完整**

二叉搜尋樹JAVA實現

引入 二叉搜尋樹是這樣的一種二叉樹 1 每個元素都有乙個關鍵值,並且沒有任意兩個元素有相同的關鍵值 2 根節點的左子樹中任意元素的關鍵值小於根節點的關鍵值。3 根節點的右子樹中任意元素的關鍵值大於根節點的關鍵值。4 根節點的左右子樹也是二叉搜尋樹。我們這裡就用程式來實現這樣一顆二叉搜尋樹。分析 從定...

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 ...