前驅和后繼
本文所述為二叉排序樹的前驅和后繼,如果想了解二叉排序樹的概念,可以參考我的博文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