青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

bon

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

常用鏈接

留言簿(2)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

今天實現了《算法導論》里提到的二叉搜索樹。
支持的操作有:插入、刪除、查詢、前驅、后繼、遍歷等。
首先定義樹節點的結構體:
struct node{
    node(
long k,int position){
        l
=r=p=NULL;
        key
=k,pos=position;
    }
    node(){
        l
=r=p=NULL;
    }
    node 
*l,*r,*p;
    
int pos;
    
long key;
};

1. 插入操作
    
void insert(long k,int position)
{
    node 
*yy=NULL;
    node 
*xx = root;
    
while(xx!=NULL){
        yy
=xx;
        
if(k>xx->key) xx=xx->r;
        
else xx=xx->l;
    }
    node 
*z=new node(k,position);
    z
->p=yy;
    
// 空樹
    if(yy==NULL) root=z;
    
else{
        
if(yy->key<z->key) yy->r=z;
        
else yy->l=z;
    }
}
插入就是將新的鍵值放到合適的位置,使得二叉搜索樹的性質得以保存。
用兩個指針yy,xx,yy指向xx的父節點。xx跟yy同時向下搜索:當待插入鍵值小于xx指向的節點鍵值時,xx指向xx的左兒子,否則指向右兒子。yy跟進。直到xx為空,說明到達合適的位置了,此時建立新的節點并把信息存進去。修改yy所指的節點(此時為新節點的父節點)的兒子指針。

2. 刪除操作
刪除操作比較復雜一些,先看下面的代碼:
 1 bool del(long key,node &res)
 2 {
 3     node *z=search(key);
 4     if(z==NULL) return false;
 5     
 6     node *y;
 7     if(z->==NULL || z->r==NULL) y=z;
 8     else y=successor(z->key);
 9     
10     // x指向y的非空兒子,此時y最多只有一個兒子。若y無兒子,x為空
11     node *x;
12     if(y->l!=NULL) x=y->l;
13     else x=y->r;
14 
15     // y有一個兒子,則將y刪去
16     if(x!=NULL)    x->p=y->p;
17     
18     // y is the root
19     if(y->p==NULL) root=x;
20     else{
21         if(y==y->p->l) (y->p)->l=x;
22         else y->p->r=x;
23     }
24 
25     // 當y!=z時,則y是z的后繼,刪去z后,y取代z
26     if(y!=z) z->key=y->key,z->pos=y->pos;
27     res.key=z->key,res.pos=z->pos;
28     delete y;
29     return true;
30 }
刪除鍵值為k的節點時,首先要找到這個節點,用函數node *search(long k),返回一個指針指向包含該鍵值的節點(如第3行所示)。
接下來分三種情況:
被刪節點無孩子、只有一個孩子、有兩個孩子。
若是情況1或2,y指向被刪節點,否則指向被刪節點的后繼,如6~8行所示。這個操作后,y所指向的節點至多只有1個孩子(想想為什么)
接著指針x指向y唯一的孩子(若有的話)并改變x的父親指針,指向y的父節點(注意此時y的父親指針仍指向y的父親)
19~23行處理y是根的情況;26行處理case3的情況。
最后刪除y,并以引用變量res返回被刪的節點的信息。
3. 搜索
包括找一個鍵值k,找鍵值k的前驅、后繼,最大最小值。
原理比較簡單,代碼如下:
 1 // 返回以x為根的子樹的最小值
 2 node *minimum(node *x)
 3 {
 4     while(x->l!=NULL) x=x->l;
 5     return x;
 6 }
 7 
 8 node *maximum(node *x)
 9 {
10     while(x->r!=NULL) x=x->r;
11     return x;
12 }
13 
14 // 返回x的后繼,即比x大的數中最小的一個
15 node *successor(long k)
16 {
17     node *x=search(k);
18     node *y=NULL;
19     if(x->r!=NULL) return minimum(x->r);
20     else{
21         y=x->p;
22         while(y!=NULL && x==y->r){
23             x=y;
24             y=x->p;
25         }
26     }
27     // 若y==NULL 則x為根節點且無后繼
28     return y;
29 }
30 
31 node *predecessor(long k)
32 {
33     node *x=search(k);
34     node *y=NULL;
35     if(x->l!=NULL) return maximum(x->l);
36     else{
37         y=x->p;
38         while(y!=NULL && x==y->l){
39             x=y;
40             y=x->p;
41         }
42     }
43     return y;
44 }
4. 中序遍歷
   相當于是從小到大輸出樹中節點的鍵值。
1 void inorderWalk(node *x)
2 {
3     if(x!=NULL){
4         inorderWalk(x->l);
5         printf("%d ",x->key);
6         inorderWalk(x->r);
7     }
8 }

posted on 2008-03-07 20:52 bon 閱讀(520) 評論(0)  編輯 收藏 引用 所屬分類: Notes on Introduction to Algorithms

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


Google PageRank 
Checker - Page Rank Calculator
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产日韩欧美不卡| 久久久久国产一区二区| 亚洲欧美综合| 在线成人av.com| 久久久久久电影| 亚洲一区二区视频在线| 久久国产精品毛片| 亚洲精品欧美日韩| 欧美韩国日本一区| 久久综合久久久久88| 国产精品久久久久久av福利软件 | 亚洲精品之草原avav久久| 亚洲欧洲日本在线| 在线观看一区二区精品视频| 欧美日韩精品高清| 国产精品99久久久久久久久久久久| 一本色道久久综合亚洲91| 国产欧美在线播放| 亚洲欧美日韩一区二区| 麻豆精品精品国产自在97香蕉| 在线亚洲观看| 亚洲精品一级| 午夜精品成人在线| 亚洲片国产一区一级在线观看| 国产精品一区二区黑丝| 蜜桃av一区| 欧美与黑人午夜性猛交久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧美日韩成人| 亚洲精选久久| 欧美日韩免费观看中文| 午夜精品理论片| 午夜精品美女自拍福到在线 | 宅男66日本亚洲欧美视频 | 亚洲免费在线播放| 国产视频久久久久| 韩曰欧美视频免费观看| 午夜精品视频在线| 欧美一乱一性一交一视频| 久久精品理论片| 欧美日韩视频在线第一区| 欧美高清视频| 久久久久久久久综合| 亚洲美女诱惑| 亚洲视频网在线直播| 久久亚洲一区| 国产伪娘ts一区| 亚洲一区二区三区激情| 欧美国产精品人人做人人爱| 亚洲男人的天堂在线观看| 欧美精品国产| 亚洲美女中出| 男女激情久久| 久久精品亚洲一区二区三区浴池 | 欧美日韩综合另类| 亚洲国产精品成人| 亚洲欧美日本在线| 亚洲免费视频观看| 亚洲精品国产精品乱码不99按摩| 欧美一区二区三区另类 | 国内成人精品一区| 99xxxx成人网| 欧美激情精品久久久久| 久久成人精品无人区| 国产视频欧美| 久久av老司机精品网站导航| 亚洲无线一线二线三线区别av| 欧美三级电影一区| 亚洲综合电影一区二区三区| 中国日韩欧美久久久久久久久| 欧美日韩国产成人高清视频| 一本色道久久综合狠狠躁的推荐| 亚洲另类一区二区| 欧美日韩亚洲激情| 亚洲欧洲av一区二区| 亚洲综合不卡| 国产一区二区三区成人欧美日韩在线观看 | 六月婷婷久久| 1024亚洲| 欧美激情第8页| 欧美精品一区二区三区在线播放| 一区二区三区在线看| 亚洲承认在线| 欧美日韩不卡| 欧美在线视频在线播放完整版免费观看 | 欧美日韩日日夜夜| 亚洲资源av| 午夜免费久久久久| 91久久精品一区二区三区| 一本久久青青| 激情五月综合色婷婷一区二区| 欧美国产在线观看| 欧美精品在线视频观看| 亚洲欧美国产毛片在线| 欧美一级视频| 亚洲欧洲精品一区二区| 一区二区三区国产在线观看| 国内在线观看一区二区三区| 亚洲欧洲一区二区三区在线观看| 国产精品美女久久久久久久| 久久综合99re88久久爱| 亚洲欧美国产一区二区三区| 国产精品亚洲视频| 免费人成网站在线观看欧美高清| 欧美国产亚洲另类动漫| 久久99伊人| 欧美日韩1区2区3区| 久久天堂av综合合色| 欧美午夜精品| 欧美成人免费网站| 国产欧美精品在线播放| 亚洲乱码国产乱码精品精98午夜| 欧美伦理在线观看| 国产精品男gay被猛男狂揉视频| 亚洲欧美国产三级| 亚洲少妇自拍| 亚洲高清免费在线| 午夜激情久久久| 一区二区三区国产精品| 久久九九久精品国产免费直播| av成人免费| 欧美福利电影网| 狂野欧美一区| 国产一区二区三区四区五区美女| 欧美激情一二三区| 影音先锋在线一区| 久久成人人人人精品欧| 欧美一级理论片| 国产精品theporn| 亚洲区一区二| 一本久道久久久| 欧美一区二区三区在| 91久久在线| 欧美日韩亚洲一区三区| 最新国产の精品合集bt伙计| 小黄鸭精品aⅴ导航网站入口| 久久艳片www.17c.com| 欧美人与禽猛交乱配| 免费黄网站欧美| 好吊一区二区三区| 性8sex亚洲区入口| 久久精品青青大伊人av| 国产精品专区第二| 午夜免费电影一区在线观看| 欧美一级免费视频| 国产日韩一区二区三区在线| 亚洲欧美日本伦理| 久久精品亚洲| 国产综合色产| 久久精品中文| 蜜臀久久99精品久久久画质超高清 | 欧美国产一区二区三区激情无套| 国产日韩精品一区二区三区在线| 亚洲国内自拍| 欧美96在线丨欧| 黄色成人精品网站| 久久久久天天天天| 亚洲国产成人久久综合一区| 亚洲欧洲精品一区二区三区不卡| 榴莲视频成人在线观看| 亚洲国产专区校园欧美| 国产精品入口尤物| 久久精品人人做人人爽电影蜜月| 久久亚洲精品中文字幕冲田杏梨| 伊人成年综合电影网| 狂野欧美激情性xxxx| 亚洲韩国精品一区| 亚洲欧美综合精品久久成人| 国产午夜精品久久久久久免费视| 亚洲香蕉伊综合在人在线视看| 亚洲人成在线免费观看| 欧美激情一区二区三区成人| 99精品欧美一区二区三区综合在线| 国产精品99久久久久久人| 中文av一区二区| 国产一区二区三区的电影| 久久精品九九| 亚洲综合首页| 国产精品mm| 亚洲大胆女人| 午夜免费日韩视频| 亚洲黄色av| 香蕉免费一区二区三区在线观看 | 狂野欧美性猛交xxxx巴西| 亚洲黄网站黄| 亚洲一区二区三区精品视频| 美女脱光内衣内裤视频久久影院 | 一本在线高清不卡dvd| 亚洲一区日韩| 久久不见久久见免费视频1| 欧美激情亚洲激情| 亚洲伦理在线| 亚洲欧洲日产国产综合网| 欧美高清视频www夜色资源网| 欧美一区二区三区四区在线观看地址 | 一区二区欧美激情| 国产啪精品视频| 国产精品福利片| 麻豆av一区二区三区久久| 欧美亚洲一区二区在线|