紅/黑樹狀結構系列之旋轉C++實現

來源:互聯網
上載者:User

(1)概述 

         二叉樹是使用非常廣泛的資料結構,但如果是常規的插入,會導致二叉樹的高度過高和出現整棵樹不平衡的情況。紅/黑樹狀結構是一種平衡二叉樹,C++STL中的set,map及其擴充容器內部的資料結構都是紅/黑樹狀結構。

(2)左旋轉

         比如說,需要把x旋轉為y的左結點。整個演算法的思路非常清晰:從上至下,先得到y指標,講x的右指標指向y的左結點,然後利用parent函數得到x的父親結點,如果為NULL,則y為新的根,如果不為NULL,則根據x是其父親的左孩子還是右孩子,將指標指向y。最後將y的左指標指向x,完成旋轉。值得注意的是,演算法是具有順序的邏輯步驟,不能夠調換順序,如果改變賦值的順序會造成記憶體失去指標指向,出現記憶體錯誤。

       代碼:註:parent為求父親結點的函數,root是始終指向根結點記憶體地區的指標。

[cpp] view plain copy //左旋轉,假設x->pRight!=NULL   void left_rotate(NODE *head,NODE *x)//head是根結點,x是待左旋轉的結點   {       if(x->pRight!=NULL)       {           NODE *y=x->pRight;           if(y->pLeft!=NULL)               x->pRight=y->pLeft;           NODE *px=parent(x,head);           if(px==NULL)//如果x是根結點,那麼就把y置為根結點               root=y;           else if(px->pLeft==x)               px->pLeft=y;           else               px->pRight=y;           y->pLeft=x;       }       else           printf("item為%ld的結點不能夠進行左旋轉。",x->item);   }  
(3)右旋轉

        方法與左旋轉基本相同,只是方向相反,不再贅述其過程。

        代碼:

[cpp] view plain copy //右旋轉,假設y->pLeft!=NULL      void right_rotate(NODE *head,NODE *y)//head是根結點,y是待右旋轉的結點   {       if(y->pLeft!=NULL)       {           NODE *x=y->pLeft;           if(x->pRight!=NULL)               y->pLeft=x->pRight;           NODE *py=parent(y,head);           if(py==NULL)               root=x;           else if(py->pLeft==y)               py->pLeft=x;           else               py->pRight=x;           x->pRight=y;       }       else           printf("item為%ld的結點不能夠進行右旋轉。",y->item);   }  
[cpp] view plain copy //返回父親結點   NODE *parent(NODE *pNode,NODE *head)   {       NODE *result=NULL;       if(head!=NULL)       {           if(head->pLeft==pNode || head->pRight==pNode)               return head;           if(head->pLeft!=NULL)           {               result=parent(pNode,head->pLeft);               if(result!=NULL)//找到之後就不搜尋其他的了                   return result;           }           if(head->pRight!=NULL)           {               result=parent(pNode,head->pRight);               if(result!=NULL)                   return result;           }       }       return result;//沒有找到,返回NULL   }  

        總結:旋轉的演算法思路非常清晰,整個邏輯思考是重點。


[轉載自 http://blog.csdn.net/neilhappy/article/details/7209873]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.