手寫二叉排序樹(二叉查詢樹 二叉搜尋樹)

2022-06-17 18:06:09 字數 3091 閱讀 8719

在二叉排序樹中,每個根節點只能有左右兩個子節點,左子節點比根節點小,右子節點比根節點大(treeset中不允許出現相同元素。一些場景下,如果子節點和根節點相同會將子節點放到根節點的右邊)。

二叉搜尋樹

public

class binarysearchtreeextends comparable>

else

size++;

return

true

; }

//遞迴新增子節點

private

void

add(t data, node root)

else

} else

}//列印二叉樹檢視結果

public

object list()

//遞迴函式

private

void

toarray(node node, arraylist list)

system.out.println(node.data);

//列印自身節點

list.add(node.data);

//如果有右邊節點,一樣遞迴

node right =node.right;

if (right != null

)

return

; }

public

intsize()

//判斷節點是否存在

public

boolean

contains(t data)

else

}int x = 0;//

記錄樹的遍歷次數,以檢驗是否是最優解

//查詢節點

private

node query(t data, node node)

node left =node.left;

node right =node.right;

//向左查詢

if (i > 0 && left != null

) else

if (i < 0 || right != null)

else

}/** 刪除節點有三種情況

* 1 被刪除的節點無子孫節點,直接刪除。

* 2 被刪除的節點只有左子節點或者只有右子節點,需要將左或者右子節點頂替被刪除的節點。

* 3 被刪除的節點有左子節點或者右子節點,這種情況有兩種方案。

* 1 從左節點族群中找到最右邊的子孫節點。

* 2 從右節點族群中找到最左邊的子孫節點。

* 二叉樹的規則是節點左邊的小於節點,節點右邊的大於或等於節點。所以找到左邊的最右邊或者右邊

* 的最左邊這兩個值是最接近於被刪除節點的。我這裡取值是左邊的最右邊

* */public

t remove(t data)

//如果只有乙個節點,那麼肯定是root節點

if (size == 1)

else

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

else

} else

if (removenode.left == null || removenode.right == null)

else

//如果被刪除的節點沒有父節點,說明這個節點是根節點

node removenodeparent =removenode.parent;

//如果不是根節點。

if (removenodeparent != null

) else

//斷開被刪除節點與父節點的指標

removenode.parent = null

; }

else

} else

else

//被刪除節點的父節點

node removenodeparent =removenode.parent;

//被刪除的節點不是根節點

if (removenodeparent != null

) else

//如果被刪除節點的左節點不是替代節點

//則需要將被刪除節點的左節點交給替代節點的左節點

if (removenode.left !=newchild)

//被刪除元素的右節點交給替代節點的右節點

newchild.right =removenode.right;

//埠被刪除節點與子節點和父節點的指標

removenode.parent = null

; removenode.left = null

; removenode.right = null

; }

else

//將根節點的右子節點交給替代節點的右邊

newchild.right =root.right;

//替代節點成為根節點

root =newchild;}}

//長度-1

size--;

//返回被刪除節點的資料

return

removenode.data;

}//獲取左節點族中最右邊的節點

private

node queryleftinright(node node)

return

node;

}class

node

public

void

setleft(node left)

public

void

setright(node right) }}

view code

二叉排序樹可能會退化程鍊錶

二叉排序樹 二叉搜尋樹 二叉查詢樹

特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...

二叉排序樹(二叉查詢樹 二叉搜尋樹)

include include typedef struct node node node createnode int value void addnode node root,int value else else void middleorder node node middleoder no...

Codeup二叉查詢樹 二叉排序樹

輸入一系列整數,建立二叉排序數,並進行前序,中序,後序遍歷。輸入第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數。可能有多組測試資料,對於每組資料,將題目所給資料建立乙個二叉排序樹,並對二叉排序樹進行前序 中序和後序遍歷。每種遍歷結果輸出一行。每行最後乙個資料之後有乙個空格。12 2 ...