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

首頁 > 編程 > Java > 正文

JAVA之伸展樹

2019-11-11 00:11:30
字體:
來源:轉載
供稿:網友
伸展樹與二叉平衡查找樹 AVL樹(帶有平衡條件的樹)查找的時候最壞的情形為0(N)并不壞,只要它不經常發生就可以。任何一次訪問,即使花費0(N),任然可能非???。具有最壞運行時間0(N)但保證對任意M次連續操作最多花費O(MlogN)運行時間確實讓人滿意了。 伸展樹和其它樹的區別就是沒訪問一個節點的時候,那個節點就會成為根節點,這樣下次訪問的時候時間為0(1)并且與二叉平衡查找樹比少了高度的屬性和判斷平衡信息,因此從某種程度上簡化代碼。

在伸展樹中最主要的一部分就是伸展,分為兩種情況第一種是之字形(zig-zag)情形,第二種就是一字形(zig-zig) 這里寫圖片描述 這里寫圖片描述

package tree;/* * 伸展樹:他保證從空樹開始連續M次對樹的操作最多花費0(MlogN)時間 */public class STree<AnyType extends Comparable<? super AnyType>>{ PRivate Node root; private class Node{ public Node left;//左孩子 public Node right;//右孩子 public Node parent;//父親節點 public AnyType x;//data數據 public Node(AnyType x){ this.x = x; parent = null; left = null; right = null; } } public STree(){ root = null; } //查找 public AnyType find(AnyType key){ root = find(root, key); if(root == null || root.x.compareTo(key) != 0) return null; return root.x; } private Node find(Node p, AnyType key){ if(p == null || key == null) return null; Node prep = null; while(p != null){ prep = p; int cmp = key.compareTo(p.x); if(cmp < 0) p = p.left; else if(cmp > 0) p = p.right; else break; } root = splay(prep); return root; } //插入 public void insert(AnyType data){ if(data == null) return; if(root == null){ root = new Node(data); return; } Node t = find(root, data); int cmp = data.compareTo(t.x); if(cmp == 0){//更新value root.x = data; return; } root = new Node(data); //先把T分為左右子樹,再合并 if(cmp < 0){//插入新根,以t->lchild和t為左/右孩子 Node x = t.left; root.left = x; root.right = t; t.parent = root; if(x != null){ x.parent = root; t.left = null; } }else if(cmp > 0){ Node x = t.right; root.left = t; root.right = x; t.parent = root; if(x != null){ x.parent = root; t.right = null; } } } //刪除 public void delect(AnyType key){ if(key == null) return; Node t = find(root, key); if(t == null || key.compareTo(t.x) != 0) return; if(t.right == null){//右子樹為空 root = root.left; root.parent = null; return; } //右子數不空 //1.刪除T節點, 得到子樹tl, tr Node tl = t.left, tr = t.right; tr.parent = null; //2.將右子樹最小節點min伸展至右子樹樹根,min一定沒有左子節點 Node min = min(tr); //3.將tl作為左子樹鏈接到min上 min.left = tl; if(tl != null) tl.parent = min; root = min; } public AnyType min(){ if(root == null) return null; root = min(root); return root.x; } private Node min(Node x){ if(x == null) return null; while(x.left != null) x = x.left; x = splay(x); return x; } public AnyType max(){ if(root == null) return null; root = max(root); return root.x; } private Node max(Node x){ if(x == null) return null; while(x.right != null) x = x.right; x = splay(x); return x; } private Node splay(Node v){//v是找到的節點 if(v == null) return null; Node p, g; //v的父親與祖父 //自上而下,反復對v做雙層伸展 while((p = v.parent) != null && (g = p.parent) != null){ Node gg = g.parent;//(great-grand parent)為父 if(isLChild(v)){ if(isLChild(p)){//zig-zig(g)先g結點右旋,zig(p)在p右旋 attachAsLChild(g, p.right); attachAsRChild(p, g); attachAsLChild(p, v.right); attachAsRChild(v, p); }else{//zig-zag(p)先p右旋,再g左旋zag(g) attachAsLChild(p, v.right); attachAsRChild(v, p); attachAsRChild(g, v.left); attachAsLChild(v, g); } }else{ if(isRChild(p)){//zag-zag,zag(g)先g結點左旋,zig(p)再p左旋 attachAsRChild(g, p.left); attachAsLChild(p.left, g); attachAsRChild(p, v.left); attachAsLChild(v, p); }else{//zag-zig,先p左旋,zag(p),再g右旋zig(g) attachAsRChild(p, v.left); attachAsLChild(v, p); attachAsLChild(g, v.right); attachAsRChild(v, g); } } //若v原先的曾祖父gg不存在, 則v現在應為樹根 if(gg == null) v.parent = null; else{//否則,gg此后應該以v作為左或右孩子 if(gg.left == g) attachAsLChild(gg, v); else attachAsRChild(gg, v); } } //雙層伸展結束時,必有g == null, 但p可能非空 //若p果真非空,則額外在做一次單旋 if(p != null && p == v.parent){ if(isLChild(v)){//zig attachAsRChild(p, v.right); attachAsRChild(v, p); }else{//zag attachAsRChild(p, v.left); attachAsLChild(v, p); } } v.parent = null; return v; } //判斷n是否是父節點的左孩子 private boolean isLChild(Node n){ Node p = n.parent; return p.left == n; } //判斷n是否是父節點的右孩子 private boolean isRChild(Node n){ Node p = n.parent; return p.right == n; } //在節點p與rc(可能為空)之間建立父(左)子關系 private void attachAsLChild(Node parent, Node lchild){ parent.left = lchild; if(lchild != null) lchild.parent = parent; } //在節點p與rc(可能為空)之間建立父(右)子關系 private void attachAsRChild(Node parent, Node rchild){ parent.right = rchild; if(rchild != null) rchild.parent = parent; } public void prearder(){ prearder(root); System.out.println("前序遍歷"); System.out.println(); } private void prearder(Node p){ if(p == null) return; System.out.print(p.x+" "); prearder(p.left); prearder(p.right); } //測試 public static void main(String[] args){ STree<Integer> st = new STree<Integer>(); for(int i=0; i<10; i++) st.insert(i); st.find(5); st.prearder(); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久久中文字幕| 日韩大胆人体377p| 96pao国产成视频永久免费| 日韩在线视频观看| 国产精品啪视频| 国内精品伊人久久| 国产99久久精品一区二区永久免费| 欧美在线亚洲一区| 国产成人综合久久| 久久久国产一区二区三区| 91午夜理伦私人影院| 久久影院模特热| 中文字幕日韩欧美在线视频| 国产精品色婷婷视频| 久久亚洲精品网站| 久久好看免费视频| 亚洲欧洲成视频免费观看| 91精品国产自产在线老师啪| 中文综合在线观看| 日韩欧美国产免费播放| 久久欧美在线电影| 日韩av片免费在线观看| 岛国精品视频在线播放| 精品久久久久久久大神国产| 亚洲黄色免费三级| 日韩电影免费观看在线观看| 91色视频在线观看| 日韩成人中文电影| 欧美老女人在线视频| 国产丝袜一区视频在线观看| 亚洲第一福利网站| 亚洲精品国精品久久99热一| 萌白酱国产一区二区| 久久久免费高清电视剧观看| 中文字幕亚洲一区二区三区五十路| 久久精品一区中文字幕| 久久夜色精品国产| 亚洲国产精品99久久| 在线亚洲欧美视频| 亚洲精品一区在线观看香蕉| 亚洲性生活视频| 国产日韩欧美一二三区| 亚洲激情在线观看视频免费| 日韩成人激情视频| 91视频88av| 国产精品第三页| 日韩的一区二区| 在线看国产精品| 亚洲xxxx18| 在线电影欧美日韩一区二区私密| 亚洲欧美日韩综合| 色777狠狠综合秋免鲁丝| 黑人巨大精品欧美一区免费视频| 精品国产拍在线观看| 在线午夜精品自拍| 成人国产精品色哟哟| 精品国产乱码久久久久酒店| 国产精品视频1区| 日本精品免费一区二区三区| 青青久久av北条麻妃黑人| 4438全国成人免费| 美女av一区二区| 日韩欧美aⅴ综合网站发布| 国产精品稀缺呦系列在线| 午夜精品久久久久久久久久久久久| 国产香蕉一区二区三区在线视频| 国产丝袜精品第一页| 久久九九免费视频| 亚洲欧美在线免费观看| 国产91对白在线播放| 欧美性猛交xxxx免费看漫画| 97av在线视频免费播放| 91超碰caoporn97人人| 91精品成人久久| 日本精品性网站在线观看| 亚洲成人xxx| 丝袜美腿亚洲一区二区| 精品免费在线视频| 日韩精品免费在线观看| 51精品国产黑色丝袜高跟鞋| 亚洲精品www久久久| 97视频国产在线| 久久综合伊人77777| 亚洲人成电影网站色…| 亚洲最大福利视频网| 国产综合香蕉五月婷在线| 欧美日韩亚洲视频一区| 久久国产精品免费视频| 国产一区二区美女视频| 国产精品成熟老女人| 国产日本欧美一区二区三区在线| 久热精品视频在线观看| 日韩在线视频国产| 日韩亚洲在线观看| 久久精品国产精品亚洲| 亚洲电影成人av99爱色| 亚洲一区二区久久| 欧美在线一级va免费观看| 38少妇精品导航| 亚洲最大在线视频| 欧美黄色片在线观看| 亚洲欧美在线磁力| 午夜精品久久久久久久久久久久| 91在线|亚洲| 亚洲摸下面视频| 国产精品久久久久久久av大片| 91av在线免费观看| 欧美最近摘花xxxx摘花| 精品久久久久久久中文字幕| 色av中文字幕一区| 亚洲小视频在线| 日韩在线视频中文字幕| 欧美大尺度激情区在线播放| 最近中文字幕2019免费| 日韩欧美第一页| 91精品国产91久久久久福利| 国产精品爽黄69| 欧美肥臀大乳一区二区免费视频| 亚洲丝袜在线视频| 欧美成人免费全部观看天天性色| 国产成人免费av电影| 欧美日韩999| 亚洲视频在线免费观看| 亚洲精品mp4| 26uuu另类亚洲欧美日本一| 国产精品欧美在线| 国产美女主播一区| 一个人看的www久久| 欧美日韩精品在线| 国产精品美女久久久免费| 日韩欧美国产视频| 日韩va亚洲va欧洲va国产| 国产狼人综合免费视频| 午夜精品福利电影| 国产精品久久久久久久久久三级| 国产精品美女在线观看| 性欧美激情精品| 欧美俄罗斯性视频| 亚洲丝袜在线视频| 国产精品久久久久久av福利| 久久频这里精品99香蕉| 美日韩精品视频免费看| 欧美色道久久88综合亚洲精品| 日韩最新中文字幕电影免费看| 91精品视频在线播放| 日韩一区二区三区xxxx| 日韩精品在线看| 日韩精品极品在线观看播放免费视频| 国产精品永久免费| 国产精品激情自拍| 国产视频精品va久久久久久| 姬川优奈aav一区二区| 欧美午夜宅男影院在线观看| 亚洲色图15p| 国产91精品青草社区| 久久亚洲一区二区三区四区五区高| 欧美中在线观看| 欧美日韩国产999| 日韩av在线资源| 亚洲一级免费视频| 国产精品免费观看在线| 久久久久亚洲精品国产| 欧美亚洲另类视频| 日韩av网址在线观看|