/**
* created by enzo cotter on 2018/7/16.
*/public
class
bstextends
comparable
>
}private node root;
private
int size;
public
bst()
public
intsize()
public
boolean
isempty(object obj)
}
//向二叉搜尋樹中新增新的元素e
public
void
add(e e)
//向以node為根的二分搜尋樹中插入元素e,遞迴演算法
//返回插入新節點後二分搜尋樹的根
private node add(node node,e e)
if (e.compareto(node.e)<0)
node.left = add(node.left,e);
else
if (e.compareto(node.e)>0)
node.right = add(node.right,e);
return node;
}
//檢視bst中是否包含元素e
public
boolean
contains(e e)
//檢視以node為根的bst中是否包含元素e,遞迴演算法
private
boolean
contains(node node,e e)
//遞迴前序遍歷
public
void
preorder()
private
void
preorder(node node)
//前序遍歷非遞迴
public
void
preordernr()
}
@override
public string tostring()
//生成以node為根節點,深度為depth的描述二叉樹的字串
private
void
generatebststring(node node,int depth,stringbuilder res)
generatebststring(node.left,depth+1,res);
generatebststring(node.right,depth+1,res);
}private string generatedepthstring(int depth)
//中序遍歷
public
void
inorder()
//中序遍歷以node為根的二叉搜尋樹,遞迴演算法
private
void
inorder(node node)
//後序遍歷
public
void
postorder()
public
void
postorder(node node)
public
class
bstextends
comparable
>
}private node root;
private
int size;
public
bst()
public
intsize()
public
boolean
isempty()
// 向二分搜尋樹中新增新的元素e
public
void
add(e e)
// 向以node為根的二分搜尋樹中插入元素e,遞迴演算法
// 返回插入新節點後二分搜尋樹的根
private node add(node node, e e)
if(e.compareto(node.e) < 0)
node.left = add(node.left, e);
else
if(e.compareto(node.e) > 0)
node.right = add(node.right, e);
return node;
}// 看二分搜尋樹中是否包含元素e
public
boolean
contains(e e)
// 看以node為根的二分搜尋樹中是否包含元素e, 遞迴演算法
private
boolean
contains(node node, e e)
// 二分搜尋樹的前序遍歷
public
void
preorder()
// 前序遍歷以node為根的二分搜尋樹, 遞迴演算法
private
void
preorder(node node)
// 二分搜尋樹的非遞迴前序遍歷
public
void
preordernr()
}// 二分搜尋樹的中序遍歷
public
void
inorder()
// 中序遍歷以node為根的二分搜尋樹, 遞迴演算法
private
void
inorder(node node)
// 二分搜尋樹的後序遍歷
public
void
postorder()
// 後序遍歷以node為根的二分搜尋樹, 遞迴演算法
private
void
postorder(node node)
// 二分搜尋樹的層序遍歷
public
void
levelorder()
}// 尋找二分搜尋樹的最小元素
public e minimum()
// 返回以node為根的二分搜尋樹的最小值所在的節點
private node minimum(node node)
// 尋找二分搜尋樹的最大元素
public e maximum()
// 返回以node為根的二分搜尋樹的最大值所在的節點
private node maximum(node node)
// 從二分搜尋樹中刪除最小值所在節點, 返回最小值
public e removemin()
// 刪除掉以node為根的二分搜尋樹中的最小節點
// 返回刪除節點後新的二分搜尋樹的根
private node removemin(node node)
node.left = removemin(node.left);
return node;
}// 從二分搜尋樹中刪除最大值所在節點
public e removemax()
// 刪除掉以node為根的二分搜尋樹中的最大節點
// 返回刪除節點後新的二分搜尋樹的根
private node removemax(node node)
node.right = removemax(node.right);
return node;
}// 從二分搜尋樹中刪除元素為e的節點
public
void
remove(e e)
// 刪除掉以node為根的二分搜尋樹中值為e的節點, 遞迴演算法
// 返回刪除節點後新的二分搜尋樹的根
private node remove(node node, e e)
else
if(e.compareto(node.e) > 0 )
else
// 待刪除節點右子樹為空的情況
if(node.right == null)
// 待刪除節點左右子樹均不為空的情況
// 找到比待刪除節點大的最小節點, 即待刪除節點右子樹的最小節點
// 用這個節點頂替待刪除節點的位置
node successor = minimum(node.right);
successor.right = removemin(node.right);
successor.left = node.left;
node.left = node.right = null;
return successor;}}
@override
public string tostring()
// 生成以node為根節點,深度為depth的描述二叉樹的字串
private
void
generatebststring(node node, int depth, stringbuilder res)
generatebststring(node.left, depth + 1, res);
generatebststring(node.right, depth + 1, res);
}private string generatedepthstring(int depth)
}
二分搜尋樹(JAVA)
二分搜尋樹是在二叉樹的基礎上定義 所有節點的左子節點需要小於 不大於 該節點,右子節點需要大於 不小於 該節點 實現 如下 注意 這裡實現的二分搜尋樹會去重,如果允許重複節點,則在新增元素時,定義值相等的元素存放在節點的左子節點或右子節點中。public class bstcomparable pr...
Java 二分搜尋
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。演算法思想 搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束 如果某一特定元素大於或者小於中間元素,則在陣列...
Java 二分搜尋 二分查詢
對陣列元素進行逐個查詢顯然是費時費力的工作,我們可以使用一些方法快速地搜尋出陣列中元素的指定位置.接下來我們介紹一種方法 二分搜尋法 二分搜尋法充分利用了元素間的次序關係.基本思想 將n元素分成個數大致相同的涼拌,取arr n 2 與欲查詢的x做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...