二分搜尋樹是在二叉樹的基礎上定義:
所有節點的左子節點需要小於(不大於)該節點,右子節點需要大於(不小於)該節點
實現**如下:
注意:這裡實現的二分搜尋樹會去重,如果允許重複節點,則在新增元素時,定義值相等的元素存放在節點的左子節點或右子節點中。
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做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...