D&F學數據結構系列——前驅和后繼


前驅和后繼

本文所述為二叉排序樹的前驅和后繼,如果想了解二叉排序樹的概念,可以參考我的博文http://www.cnblogs.com/sage-blog/p/3864640.html

 

給定一個二叉查找樹中的結點,有時候要求找出在中序遍歷順序下它的后繼。如果所有的關鍵字均不同,則某一結X點的后繼就是所有(結點值)大於X的結點中最小的那個。

包含兩種情況:

情況一:結點X的右子樹非空,則X的后繼是其右子樹中最左的結點

情況二:結點X的右子樹為空,設X的后繼為Y。則Y是X的最低祖先結點,且Y的左兒子也是X的祖先(X自身也可以看做是X的祖先)

 1 BT* TreeSuccessor(BT* T)
 2 {
 3     BT* S;
 4     if(!T)  return NULL;
 5     if(T->right)
 6     {
 7       for(S=N->right;S->left;S=S->left);
 8        return S;
 9     }
10     for(S=T;S->parent&&(S->parent->right==S);S=S->parent);
11     return S->parent;
12 }

相應的,中序遍歷下某結點X的前驅就是所有(結點值)小於X的結點中最大的那個。也包含兩種情況:

情況一:結點X的左子樹非空,則X的前驅是其左子樹中最右的結點

情況二:結點X的左子樹為空,設X的后繼為Y。則Y是X的最低祖先結點,且Y的右兒子也是X的祖先(X自身也可以看做是X的祖先)

 1 BT* TreePredecessor (BT* T)
 2 {
 3     BT * P;
 5     if (!T) return NULL;
 6     if (T->left)
       {
 7         for (P = T->left; P->right; P = P->right);
 8         return P;
 9     }
11     for (P = t; P->parent && (P->parent->left == P); P = P->parent);
12     return P->parent;
13 }

這里有一篇很詳細的Bloghttp://blog.csdn.net/markcnsc/article/details/8566466


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM