二分搜尋樹(JAVA)

2021-09-19 05:45:43 字數 4733 閱讀 4003

二分搜尋樹是在二叉樹的基礎上定義:

所有節點的左子節點需要小於(不大於)該節點,右子節點需要大於(不小於)該節點

實現**如下:

注意:這裡實現的二分搜尋樹會去重,如果允許重複節點,則在新增元素時,定義值相等的元素存放在節點的左子節點或右子節點中。

public

class

bstcomparable

>

}private node

root;

private

int size;

public

bst(

)public

intsize()

public

boolean

isempty()

public

void

inorder()

private

void

inorder

(node

node)

inorder

(node.left)

; system.out.

println

(node.val)

;inorder

(node.right);}

public

void

add(e e)

else

// version 2

root =

addelementtotreeandreturnroot

(root, e);}

/** * 將元素加入以指定節點為根的子樹中

* @param node 子樹的根節點,呼叫前需要判空

* @param e

*/private

void

addelementtotree

(node

node, e e)

if(comp <0)

else

}else

else}}

/** * 將元素加入以指定節點為根的子樹,並返回該子樹的根節點

* @param node 子樹的根節點

* @param e 元素

* @return

*/private node

addelementtotreeandreturnroot

(node

node, e e)

int comp = e.

compareto

(node.val);if

(comp <0)

else

if(comp >0)

return node;

}public

boolean

contains

(e e)

/** * 在以指定節點為根節點的子樹上搜尋元素是否存在

* @param node

* @param e

* @return

*/private

boolean

contains

(node

node, e e)

int comp = e.

compareto

(node.val);if

(comp <0)

if(comp >0)

return

true;}

public e getmin()

return

getmin

(root)

.val;

}private node

getmin

(node

node)

else

}public e getmax()

return

getmax

(root)

.val;

}private node

getmax

(node

node)

else

}public e removemin()

/** * 刪除以指定節點為根的子樹中的最小節點

* @param node

* @return 返回刪除後的子樹的根節點

*/private node

removemin

(node

node)

else

}public e removemax()

/** * 刪除以指定節點為根的子樹中的最大節點

* @param node

* @return 返回刪除後的子樹的根節點

*/private node

removemax

(node

node)

else

}public

void

remove

(e e)

private node

remove

(node

node, e e)

int comp = e.

compareto

(node.val);if

(comp <0)

if(comp >0)

if(node.left == null)

if(node.right == null)

// nodesuccessor = getmin(node.right);

// node.right = removemin(node.right);

//// successor.left = node.left;

// successor.right = node.right;

node

predecessor =

getmax

(node.left)

; node.left =

removemax

(node.left)

; predecessor.left = node.left;

predecessor.right = node.right;

return predecessor;

}/**

* 比指定元素小的最大值(地板)

* @param e

* @return

*/public e floor

(e e)

/** * 比較子樹根節點node與指定元素e的大小

* 如果 node 更大

* ----在node的左子樹中繼續找

* 如果 node 更小

* ----如果node的右子樹不存在

* --------返回 node

* ----如果node的右子樹存在

* --------搜尋右子樹的最小值

* --------如果該最小值比 e 大,返回 node

* --------如果該最小值沒有 e 大,在node的右子樹中繼續找

* 如果 相等

* ----返回 node

* @param node

* @param e

* @return

*/private node

floor

(node

node, e e)

int comp = node.val.

compareto

(e);

if(comp >0)

if(comp <0)

else

else}}

return node;

}/**

* 比指定元素大的最小值(天花板)

* @param e

* @return

*/public e ceil

(e e)

/** * 比較子樹根節點node與指定元素e的大小

* 如果 node 更小

* ----在node的右子樹中繼續找

* 如果 node 更大

* ----如果node的左子樹不存在

* --------返回 node

* ----如果node的左子樹存在

* --------搜尋左子樹的最大值

* --------如果該最大值比 e 大,或相等,在node的左子樹中繼續找

* --------如果該最大值比 e 小,返回node

* 如果 相等

* ----返回 node

* @param node

* @param e

* @return

*/private node

ceil

(node

node, e e)

int comp = node.val.

compareto

(e);

if(comp <0)

if(comp >0)

else

else}}

return node;

}private

static

comparable

> bst

fromarray

(e..

. arr)

return bst;

}public

static

void

main

(string[

] args)

}

二分搜尋樹的乙個性質:

中序遍歷的結果是有序的。

二分搜尋樹 JAVA版

created by enzo cotter on 2018 7 16.public class bstextends comparable private node root private int size public bst public intsize public boolean ise...

Java 二分搜尋

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。演算法思想 搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束 如果某一特定元素大於或者小於中間元素,則在陣列...

Java 二分搜尋 二分查詢

對陣列元素進行逐個查詢顯然是費時費力的工作,我們可以使用一些方法快速地搜尋出陣列中元素的指定位置.接下來我們介紹一種方法 二分搜尋法 二分搜尋法充分利用了元素間的次序關係.基本思想 將n元素分成個數大致相同的涼拌,取arr n 2 與欲查詢的x做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...