亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JAVA之查找二叉平衡樹

2019-11-11 00:24:10
字體:
來源:轉載
供稿:網友

查找二叉平衡樹與查找二叉樹有什么區別呢?當要進行大規模刪除操作時(先不考慮懶惰刪除),會出現某種情況,高度會逐漸的變大,是因為我們總是把右邊最小的葉子節點變為刪除的點,再去刪除右邊最大的點,這就導致了高度變大,查找數據時間變長,顯然這是要優化的。

我們需要在Node(內部節點類)中加入一個高度height的一個變量思想:當插入的時候左節點和右節點的高度度相差深度超過1的時候,必須要旋轉相應的節點來保持高度的平衡。分為4種情況 對于平衡二叉樹有4中情況 * 1.對&的左兒子的左子樹進行一次插入 * 2.對&的左兒子的右子樹進行一次插入 * 3.對&的右兒子的左子樹進行一次插入 * 4.對&的右兒子的右子樹進行一次插入package tree;/* 平衡查找二叉樹 * 對于平衡二叉樹有4中情況 * 1.對&的左兒子的左子樹進行一次插入 * 2.對&的左兒子的右子樹進行一次插入 * 3.對&的右兒子的左子樹進行一次插入 * 4.對&的右兒子的右子樹進行一次插入 */public class AVLTree<AnyType extends Comparable<? super AnyType>>{ /* * 節點內部類 */ PRivate static class AvlNode<AnyType>{ AnyType element; //數據(data) AvlNode<AnyType> left; //左節點(Left child) AvlNode<AnyType> right; //右節點(right child) int height; //高度(height) public AvlNode(AnyType x){ this(x, null, null); } public AvlNode(AnyType theElement, AvlNode<AnyType> lt, AvlNode<AnyType> rt){ element = theElement; left = lt; right = rt; } } private AvlNode<AnyType> root; //根節點 //初始化操作 public AVLTree(){ root = null; } //判斷是否為空樹 public boolean isEmpty(){ return root == null; } //直接清空樹 public void makeEmpty(){ root = null; } /* * 添加節點 */ public void insert(AnyType x){ root = insert(x, root); } /* * 前面的插入和ADT樹沒多大的區別,最大的區別就在于當插入數據的時候要先檢查插入的數據相對的高度差 * 如果差值大于1,那么就要對應的進行旋轉 */ private AvlNode<AnyType> insert(AnyType x, AvlNode<AnyType> t){ if(t == null) return new AvlNode(x ,null, null); int compareResult = x.compareTo(t.element); //比較當前節點的大小 if(compareResult > 0) t.right = insert(x, t.right); else if(compareResult < 0) t.left = insert(x, t.left); else ; return balanced(t); } private static final int ALLOWED_IMBALANCE = 1; private AvlNode<AnyType> balanced(AvlNode<AnyType> t){ if(t == null) return t; if(height(t.left) - height(t.right) > ALLOWED_IMBALANCE) if(height(t.left.left) >= height(t.left.right)) t = rotateWithLeftChild(t); else t = doubleWithLeftChild(t); else if(height(t.right) - height(t.left) > ALLOWED_IMBALANCE) if(height(t.right.right) > height(t.right.left)) t = rotateWithRightChild(t); else t = doubleWithRightChild(t); t.height = Math.max(height(t.left), height(t.right)) + 1; return t; } /* * 每個節點的高度情況 只有三種情況 0 1 -1 */ private int height(AvlNode<AnyType> t){ return t == null ? -1 : t.height; } /* * 第一種情況:對&的左兒子的左子樹進行一次插入(單旋轉) k2 k1 k1 z ---> x k2 x y y z */ private AvlNode<AnyType> rotateWithLeftChild(AvlNode<AnyType> k2){ AvlNode<AnyType> k1 = k2.left; k2.left = k1.right; //k2的左子樹等于k1的右子樹 k1.right = k2; k2.height = Math.max(height(k2.left), height(k2.right)) + 1; k1.height = Math.max(height(k1.left), k2.height) + 1; return k1; } /* * 第二種情況:對&的左兒子的右子樹進行一次插入(雙旋轉) * k3 k2 * k1 d ---> k1 k3 * a k2 a b c d * b c */ private AvlNode<AnyType> doubleWithLeftChild(AvlNode<AnyType> k3){ k3.left = rotateWithLeftChild(k3.left); return rotateWithLeftChild(k3); } /* * 第三種情況:對&的右兒子的左子樹進行一次插入(單旋轉) k2 k1 z k1 ---> k2 y x y z x */ private AvlNode<AnyType> rotateWithRightChild(AvlNode<AnyType> k2){ AvlNode<AnyType> k1 = k2.right; k2.right = k1.left; //k2的左子樹等于k1的右子樹 k1.left = k2; k2.height = Math.max(height(k2.left), height(k2.right)) + 1; k1.height = Math.max(height(k1.right), k2.height) + 1; return k1; } /* * 第四種情況:對&的右兒子的右子樹進行一次插入(雙旋轉) */ private AvlNode<AnyType> doubleWithRightChild(AvlNode<AnyType> k3){ k3.right = rotateWithRightChild(k3.right); return rotateWithRightChild(k3); } /* * 同樣,刪除操作是最麻煩的操作,當刪除一個節點的時候,也有可能會造成樹的不平衡, * 所以也要調用balanced方法 */ public void remove(AnyType x){ remove(x, root); } private AvlNode<AnyType> remove(AnyType x, AvlNode<AnyType> t){ if(t == null) return t; int compareResult = x.compareTo(t.element); if(compareResult < 0) t.left = remove(x, t.left); else if(compareResult > 0) t.right = remove(x, t.right); else if (t.left != null && t.right != null){ t.element = findMin(t.right).element; t.right = remove(t.element, t.right); }else t = (t.left != null) ? t.left : t.right; return balanced(t); } /* * 取樹中的最小值(一直找左子樹就ok) */ public AnyType findMin(){ if(isEmpty()) throw new NullPointerException(); return findMin(root).element; } private AvlNode<AnyType> findMin(AvlNode<AnyType> t){ if(t == null) return null; else if(t.left == null) return t; return findMin(t.left); } /* * 去樹中的最大值(一直找右子樹) */ public AnyType findMax(){ if(isEmpty()) throw new NullPointerException(); return findMax(root).element; } private AvlNode<AnyType> findMax(AvlNode<AnyType> t){ if(t == null) return null; else if(t.right == null) return t; return findMax(t.right); } public void printTree(){ if(isEmpty()) System.out.println("空樹"); else printTree(root); } private void printTree(AvlNode<AnyType> t){ if(t != null){ System.out.println("值:" + t.element+" " + ",高度:" + t.height); printTree(t.left); printTree(t.right); } } public static void main(String[] args){ AVLTree<Integer> bst = new AVLTree<>(); bst.insert(1); bst.insert(2); bst.insert(3); bst.insert(4); bst.insert(5); bst.insert(6); bst.printTree(); System.out.println("最小值:" + bst.findMin()); }}
上一篇:JAVA的代碼塊

下一篇:Java并發編程總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区二区三区久久久| 中文字幕在线视频日韩| 欧美国产视频一区二区| 成人精品aaaa网站| 2023亚洲男人天堂| 亚洲女同精品视频| 欧美激情一级精品国产| 亚洲精品按摩视频| 精品久久久久久亚洲国产300| 亚洲男人天堂网站| 欧美xxxx18性欧美| 日韩欧美主播在线| 欧美另类精品xxxx孕妇| 国产精品爽爽爽| 青青在线视频一区二区三区| 狠狠干狠狠久久| 国产精品成人aaaaa网站| 亚洲色图色老头| 久久久久久久av| 日本伊人精品一区二区三区介绍| 久久在线精品视频| 超薄丝袜一区二区| 亚洲精品视频久久| 亚洲欧美成人网| 色青青草原桃花久久综合| 中文字幕精品视频| 91九色国产社区在线观看| 亚洲韩国欧洲国产日产av| 8090理伦午夜在线电影| 国产噜噜噜噜久久久久久久久| 4k岛国日韩精品**专区| 亚洲最大福利视频网| 欧美日韩国产激情| 欧美国产激情18| 亚洲国产又黄又爽女人高潮的| 992tv成人免费视频| 欧美激情第99页| 久久视频中文字幕| 中文字幕亚洲欧美日韩在线不卡| 日韩在线视频观看正片免费网站| 69精品小视频| 国产精品成人品| 在线看日韩欧美| 中国china体内裑精亚洲片| 在线播放日韩欧美| 在线精品高清中文字幕| 久久久精品一区二区三区| 日韩av在线资源| 韩日精品中文字幕| 国产精品精品一区二区三区午夜版| 日本一区二区三区四区视频| 日本一区二区三区在线播放| 国产在线精品自拍| 欧美精品videosex性欧美| 亚洲精品黄网在线观看| 日韩麻豆第一页| 亚洲最大的av网站| 久久久久久久久久亚洲| 国产日韩在线免费| 成人自拍性视频| 亚洲自拍偷拍视频| 久久久久久久影院| 亚洲精品国产美女| 欧美黑人极品猛少妇色xxxxx| 国产精品久久久久久久久男| 欧美丰满少妇xxxxx| 日韩av免费在线看| 亚洲人成五月天| www.亚洲一区| 国产精品色午夜在线观看| 亚洲a成v人在线观看| 亚洲免费伊人电影在线观看av| 大伊人狠狠躁夜夜躁av一区| 国产亚洲综合久久| 国产精品人人做人人爽| 日韩av一卡二卡| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品偷伦视频免费观看国产| 亚洲美女又黄又爽在线观看| 亚洲社区在线观看| 欧美精品久久久久久久免费观看| 色悠悠久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 在线免费观看羞羞视频一区二区| 国产欧美一区二区三区在线| 亚洲欧美色图片| 国产一区二中文字幕在线看| 国产精品88a∨| 国产亚洲精品久久久久动| 欧美片一区二区三区| 日韩中文在线不卡| 91禁国产网站| 久久久久久久久久久av| 欧美贵妇videos办公室| 亚洲国产一区二区三区在线观看| 久久久久久国产精品三级玉女聊斋| 欧美综合第一页| 欧美野外猛男的大粗鳮| 日韩欧美福利视频| 国产午夜精品视频免费不卡69堂| 国模视频一区二区| 国产精品综合久久久| 亚洲高清av在线| 成人免费黄色网| 久久好看免费视频| 亚洲成人网在线观看| 亚洲精品国产精品国自产观看浪潮| 久久精品中文字幕一区| 亚洲新声在线观看| 精品国产一区二区三区久久| 国产激情综合五月久久| 成人精品一区二区三区| 精品国模在线视频| 成人国内精品久久久久一区| 国产精品久久久久久av下载红粉| 欧美日韩在线免费| 91精品久久久久久久久久入口| 日本国产欧美一区二区三区| 久久国产精品99国产精| 日韩最新中文字幕电影免费看| 在线成人免费网站| 久久久亚洲欧洲日产国码aⅴ| 91牛牛免费视频| 国产精品久久久久久久久久ktv| 懂色av影视一区二区三区| 国产精品视频1区| 亚洲欧美日韩中文在线制服| 久久久久久尹人网香蕉| 国产精品嫩草影院一区二区| 国产欧美一区二区三区视频| 日韩精品久久久久久福利| 国产精品白嫩初高中害羞小美女| 黑人欧美xxxx| 国产精品久久久久高潮| 久久久精品免费视频| 国产91在线播放精品91| 欧美日韩中文字幕| 91欧美精品午夜性色福利在线| 欧美视频一二三| 自拍偷拍亚洲精品| 欧美大片第1页| 欧美日韩国产成人| 91精品国产综合久久男男| 欧美激情亚洲精品| 久久久久国产精品www| 欧美麻豆久久久久久中文| 国产精品视频大全| 国产大片精品免费永久看nba| 日韩av一区在线| 亚洲精品久久久久国产| 午夜精品一区二区三区在线播放| 国产噜噜噜噜久久久久久久久| 人人做人人澡人人爽欧美| 日韩欧美在线字幕| 精品爽片免费看久久| 国产精品99久久久久久久久久久久| 91免费视频国产| 66m—66摸成人免费视频| 亚洲人成亚洲人成在线观看| 日韩中文在线不卡| 97视频免费在线看| 国产欧美一区二区| 亚洲一级片在线看| 国产精品毛片a∨一区二区三区|国|