資料結構 二分搜尋樹篇

2021-10-20 00:25:39 字數 4113 閱讀 4027

樹結構本身是一種天然的組織結構

二叉樹和鍊錶一樣,動態資料結構

class node
二分搜尋樹:也是二叉樹

二分搜尋樹的每個節點的值:

1. 定義二分搜尋樹節點

public class bst> 

}private node root;

private int size;

public bst()

public int size()

public boolean isempty()

}

2. 二分搜尋操作
//向二分搜尋樹中新增新的元素e

public void add(e e)else

}//向以node為根的二分搜尋樹中插入元素e,遞迴演算法

private void add(node node,e e)else if(e.compareto(node.e)<0 && node.left==null)else if(e.compareto(node.e)>0 && node.right==null)

if(e.compareto(node.e)<0)else

}

public void add(e e)

//返回插入新節點後二分搜尋樹的根(相同元素放不進來)

private node add(node node,e e )

if(e.compareto(node.e)<0)else if(e.compareto(node.e)>0)

return node;

}

//看二分搜尋樹中是否包含元素e

public boolean contains(e e)

//以node為根的二分搜尋樹中是否包含元素額,遞迴演算法

private boolean contains(node node,e e)

if(e.compareto(node.e)==0)else if(e.compareto(node.e)<0)else

}

//尋找二分搜尋樹的最小元素

public e minimum()

return minimum(root).e;

}//返回以node為根的二分搜尋樹的最小值所在的節點

private node minimum(node node)

return minimum(node.left);

}//從二分搜尋樹中刪除最小值所在的節點,返回最小值

public e removemin()

//刪除掉以node為跟的二分搜尋樹中的最小節點

//返回刪除節點後新的二分搜尋樹

private node removemin(node node)

node.left = removemin(node.left);

return node;

}

//尋找二分搜尋樹的最大元素

public e maximum()

return maximum(root).e;

}//返回以node為根的二分搜尋樹的最大值所在的節點

private node maximum(node node)

return maximum(node.right);

}//從二分搜尋樹中刪除最小值所在的節點,返回最大值

public e removemax()

//刪除掉以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;}}

3. 二分搜尋樹的遍歷
//二分搜尋樹的前序遍歷

public void preorder()

private void preorder(node node)*/

if(node!=null)

}

測試類:

@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 class main ;

for(int num:nums)

system.out.println(bst);

bst.preorder();}}

//二分搜尋樹的中序遍歷

public void inorder()

//中序遍歷以node為根的二分搜尋樹,遞迴演算法

private void inorder(node node)else

}

//二分搜尋樹的後續遍歷

public void postorder()

//後續遍歷以node為根的二分搜尋樹,遞迴演算法

private void postorder(node node)else

}

應用: 為二分搜尋樹釋放記憶體

//二分搜尋樹的層序遍歷:廣度優先遍歷

public void levelorder()

if (cur.right != null) }}

廣度優先遍歷的意義:更快的找到問題的解

常用語演算法設計中-最短路徑

圖中的深度優先遍歷和廣度優先遍歷

//前序遍歷的非遞迴(深度優先遍歷)

public void preordernr()

if (cur.left != null) }}

資料結構 二分搜尋樹(BST)

1.二分搜尋樹的簡單介紹 一般來講,二叉樹的儲存資料的基本結構是封裝乙個node節點,儲存左右兩個孩子的node變數,以及乙個泛型資料,二分搜尋樹需要泛型型別實現comparable介面 必須保證左子樹的資料比右子樹大 created by upupgogogo on 2018 5 30.上午11 ...

資料結構 線段樹 二分

以線段樹 區間修改為例,假如是單點修改只需要把pushdown去掉 可以解決形如 無序陣列中第乙個大於等於x的值的位置 pairlowerbound int u,int l,int r,ll x if mx u x return res if l r return res pushdown u,l,...

演算法與資料結構之二分搜尋樹 BST

二分搜尋樹是一顆二叉樹,二分搜尋樹的每個節點的值 大於其左子樹的所有節點的值,小於其右子樹的所有節點的值,每一顆子樹也是二分搜尋樹,二分搜尋樹儲存的元素必須具有可比較性 二分搜尋樹的定義public class bstcomparable private node root private int ...