<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
a.是個二元樹(每個節點最多有兩個子節點)
b.對於這棵樹中的節點的節點值
左子樹中的所有節點值 < 根節點 < 右子樹的所有節點值
二分搜尋樹中一般不考慮值相等的情況(元素不重複)JDK中的搜尋樹就不存在相同的值(TreeMap-key)
最大特點:也是判斷是否是搜尋樹的方法
對該樹進行中序遍歷,就可以得到一個升序集合0 1 2 3 4 5 6 7 8 9
在一個有序區間上進行二分查詢的時間複雜度? logn不斷將集合/2/2 / 2 ==1為止logN
logN =》聯想到"樹"
當刪除58時,此節點左右子樹都不為空
Hibbard Deletion 1962
在BST中刪除一個左右子樹都存在的節點
找到當前以58為根節點的前驅或者後繼節點作為刪除後的新節點
前驅:在以58為根的BST中最後一個小於58的節點->53
後繼:在以58為根的BST中第一個大於58的節點->59
當我們使用後繼節點時,先連removeMin(root.right),在連root.left
TreeNode successor = findMin(root.right); successor.right = removeMin(root.right); successor.left = root.left;
import java.util.NoSuchElementException; /** * 基於整型的 * 普通的二分搜尋樹 */ public class BST { private class TreeNode{ private int val; private TreeNode left; private TreeNode right; public TreeNode(int val) { this.val = val; } } private int size; private TreeNode root; /** * 向以root為根的BST中插入一個新的結點val * @param val */ public void add(int val){ root = add(root,val); } private TreeNode add(TreeNode root, int val) { if(root == null){ //建立一個新節點 TreeNode newNode = new TreeNode(val); size++; return newNode; } //左子樹插入 if(val < root.val){ root.left = add(root.left,val); } //右子樹插入 if(val > root.val){ root.right = add(root.right,val); } return root; } /** * 判斷當前以root為根的BST中是否包含了val * @param val * @return */ public boolean contains(int val){ return contains(root,val); } private boolean contains(TreeNode root, int val) { if(root == null){ return false; } if(val == root.val){ //找到了 return true; }else if(val < root.val){ //遞迴左子樹查詢 return contains(root.left,val); }else{ //遞迴右子樹查詢 return contains(root.right,val); } } /** * 找到最小值 * @return */ public int findMin(){ //判空 if(root == null){ //丟擲一個空指標異常 throw new NoSuchElementException("root is empty! cannot find min"); } TreeNode minNode = findMin(root); return minNode.val; } private TreeNode findMin(TreeNode root) { //當此節點左子樹為空,說明此節點是最小值 if(root.left == null){ return root; } //遞迴存取左子樹 return findMin(root.left); } /** * 找到最大值 * @return */ public int findMax(){ //判空 if(root == null){ throw new NoSuchElementException("root is empty! cannot find max"); } TreeNode maxNode = findMax(root); return maxNode.val; } private TreeNode findMax(TreeNode root) { //當此節點右子樹為空,說明此節點是最大值 if(root.right == null){ return root; } //遞迴存取右子樹 return findMax(root.right); } /** * 在當前BST中刪除最小值節點,返回刪除的最小值 * @return */ public int removeMin(){ int min =findMin(); root = removeMin(root); return min; } private TreeNode removeMin(TreeNode root) { if(root.left == null){ TreeNode right = root.right; //找到最小值,刪除節點 root = root.left = null; size--; return right; } root.left = removeMin(root.left); return root; } /** * 在當前BST中刪除最大值節點,返回刪除的最大值 * @return */ public int removeMax(){ int max = findMax(); root = removeMax(root); return max; } //在當前以root為根的BST中刪除最小值所在的節點,返回刪除後的樹根 private TreeNode removeMax(TreeNode root) { if(root.right == null){ TreeNode right = root.right; //找到最大值,刪除節點 root = root.right = null; size--; return right; } root.right = findMax(root.right); return root; } /** * 在當前以root為根節點的BST中刪除值為val的節點 * 返回刪除後的新的根節點 * @return */ public void removeValue(int value){ root = removeValue(root,value); } private TreeNode removeValue(TreeNode root, int value) { if(root == null){ throw new NoSuchElementException("root is empty! cannot find remove"); }else if(value < root.val){ root.left = removeValue(root.left,value); return root; }else if(value > root.val){ root.right = removeValue(root.right,value); return root; }else { //此時value == root.value if(root.left == null){ //刪除最小數 TreeNode right = root.right; root = root.right = null; size--; return right; } if(root.right == null){ //刪除最大數 TreeNode left = root.left; root = root.left =null; size--; return left; } //找到當前該刪除節點的前驅或者後繼節點作為刪除後的新節點 //當我們使用後繼節點時,先連removeMin(root.right),在連root.left TreeNode successor = findMin(root.right); successor.right = removeMin(root.right); successor.left = root.left; return successor; } } @Override public String toString() { StringBuilder sb = new StringBuilder(); generateBSTString(root,0,sb); return sb.toString(); } //直觀列印,可以看到樹的深度 private void generateBSTString(TreeNode root, int height, StringBuilder sb) { if(root == null){ sb.append(generateHeightString(height)).append("NULLn"); return; } sb.append(generateHeightString(height)).append(root.val).append("n"); generateBSTString(root.left,height+1,sb); generateBSTString(root.right,height+1,sb); } private String generateHeightString(int height) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < height; i++) { sb.append("--"); } return sb.toString(); } }
到此這篇關於Java實現二分搜尋樹的範例程式碼的文章就介紹到這了,更多相關Java二分搜尋樹內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45