樹結構本身是一種天然的組織結構
二叉樹和鍊錶一樣,動態資料結構
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 ...