二分搜尋樹 JAVA版

2021-08-21 20:50:26 字數 4716 閱讀 1385

/**

* 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做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...