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

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 閱讀(521) 評論(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>
            欧美福利电影网| 红桃视频亚洲| 亚洲黄色在线视频| 91久久久精品| 欧美视频在线一区| 久久一本综合频道| 欧美护士18xxxxhd| 久久国产黑丝| 欧美久久精品午夜青青大伊人| 夜夜嗨av一区二区三区| 午夜在线成人av| 99伊人成综合| 久久久91精品国产一区二区三区| 夜夜嗨网站十八久久 | 国产亚洲精品美女| 亚洲成色精品| 国产一二精品视频| 夜夜嗨av一区二区三区四区| 黄色成人在线| 亚洲一区国产| 一本色道久久加勒比精品| 欧美专区在线| 午夜精品久久久久久久| 欧美成人黄色小视频| 久久精品主播| 国产精品入口日韩视频大尺度| 国产精品啊啊啊| 欧美91精品| 一区二区亚洲欧洲国产日韩| 亚洲小少妇裸体bbw| av成人免费观看| 欧美jizz19hd性欧美| 久久久亚洲高清| 国产精品五区| 夜夜嗨av一区二区三区| 最近中文字幕日韩精品| 久久免费国产| 欧美a级在线| 激情久久五月天| 久久精品国产99国产精品澳门 | 免播放器亚洲一区| 久久久视频精品| 国产精品一香蕉国产线看观看| 日韩午夜精品视频| 在线性视频日韩欧美| 欧美精品三级日韩久久| 亚洲电影激情视频网站| 在线不卡视频| 裸体一区二区三区| 欧美成在线视频| 亚洲第一精品在线| 美女在线一区二区| 欧美高清在线一区| 亚洲三级免费| 欧美交受高潮1| 亚洲毛片一区| 亚洲图片你懂的| 国产精品入口夜色视频大尺度| 亚洲免费影视| 久久久久一区二区三区| 国产亚洲精品久久久久久| 久久精品视频va| 欧美国产三级| 一区二区三区日韩在线观看| 欧美日韩久久久久久| 亚洲深夜福利网站| 欧美一区二区精品久久911| 国产一区二区三区在线观看免费 | 欧美日韩国产美女| 亚洲日本成人| 亚洲一区亚洲| 国产亚洲一级| 美女脱光内衣内裤视频久久网站| 亚洲日本在线视频观看| 亚洲香蕉在线观看| 国产欧美视频一区二区| 久久午夜电影网| 亚洲精选中文字幕| 欧美一级专区免费大片| 狠狠综合久久| 欧美日韩综合在线| 久久精品女人| 亚洲精品永久免费| 久久精品首页| 99综合电影在线视频| 国产目拍亚洲精品99久久精品| 久久理论片午夜琪琪电影网| 日韩午夜在线电影| 久久综合综合久久综合| 一区二区三区日韩精品| 精品88久久久久88久久久| 欧美日韩视频| 久久天天狠狠| 一区二区激情小说| 美女主播精品视频一二三四| 一区二区三区精品视频| 国产亚洲成精品久久| 欧美激情视频在线播放 | 亚洲无线观看| 黄色一区二区在线| 国产精品久久久久久久久免费桃花 | 国产日本欧美一区二区三区在线| 麻豆国产精品va在线观看不卡 | 欧美黄色影院| 亚洲女人天堂av| 亚洲清纯自拍| 你懂的网址国产 欧美| 午夜亚洲福利| 中文精品在线| 亚洲精品午夜| 黄色工厂这里只有精品| 国产精品拍天天在线| 欧美日本乱大交xxxxx| 久久亚洲国产精品一区二区| 亚洲伊人观看| 日韩视频在线观看一区二区| 欧美成人激情视频| 久久久久一区二区三区四区| 香蕉久久夜色| 亚洲综合精品四区| av成人免费观看| 亚洲精选大片| 在线日韩中文| 影音先锋中文字幕一区| 国产亚洲日本欧美韩国| 国产精品亚洲欧美| 欧美三级视频在线| 欧美精品久久久久久久免费观看| 久久久久久网站| 久久精品成人| 久久精品欧洲| 久久国产免费| 欧美一级一区| 久久爱www久久做| 欧美在线观看视频一区二区三区 | 亚洲性夜色噜噜噜7777| 一区二区国产在线观看| 日韩视频一区二区三区| 亚洲精品国产精品国产自| 亚洲国产成人精品女人久久久 | 欧美一区二区在线看| 亚洲欧美三级在线| 亚洲综合色在线| 午夜国产一区| 中文精品视频一区二区在线观看| 99亚洲视频| 亚洲一区日韩在线| 亚洲欧美精品中文字幕在线| 亚洲一区三区在线观看| 亚欧成人精品| 久久久久久久久久久一区| 久久久视频精品| 美女在线一区二区| 欧美看片网站| 国产精品精品视频| 国产一区二区三区av电影| 尤物网精品视频| 日韩午夜激情| 午夜在线a亚洲v天堂网2018| 久久精品国产亚洲5555| 毛片av中文字幕一区二区| 欧美成人激情在线| 99视频精品| 欧美在线视频全部完| 久久一区二区三区四区五区| 久久久在线视频| 亚洲黄色大片| 亚洲一区二区三区四区视频| 欧美在线视频免费| 欧美激情 亚洲a∨综合| 国产精品素人视频| 亚洲高清视频中文字幕| 亚洲视频axxx| 久久一区亚洲| 一区二区三区国产盗摄| 久久国产精品久久精品国产| 欧美黑人一区二区三区| 国产色综合天天综合网| 亚洲人成网在线播放| 亚洲欧美视频在线| 欧美成人一区二区在线| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 正在播放亚洲一区| 久久精品国产999大香线蕉| 欧美日本在线播放| 国产在线国偷精品产拍免费yy| 亚洲韩国精品一区| 欧美亚洲一区二区三区| 亚洲国产精品va| 性高湖久久久久久久久| 欧美激情视频一区二区三区在线播放| 国产精品免费网站| 亚洲精品网址在线观看| 久久尤物电影视频在线观看| 亚洲免费黄色| 欧美成人免费视频| 一区二区三区在线观看欧美| 亚洲欧美韩国| 亚洲青涩在线| 欧美高清视频一二三区|