題目要求:將二叉尋找樹轉換成排序的雙向鏈表,不能建立新節點,只調整指標。
尋找樹的結點定義如下:
class Node{public: Node(int x):left(NULL),right(NULL),data(x){}; Node * left; Node * right; int data;};
既然是樹,其定義本身就是遞迴的,自然用遞迴演算法處理就很容易。
將根結點的左子樹和右子樹轉換為有序的雙向鏈表,然後根節點的left指標指向左子樹結果的最後一個結點,同時左子樹最後一個結點的right指標指向根節點;根節點的right指標指向右子樹結果的第一個結點,同時右子樹第一個結點的left指標指向根節點。
/*參數:結點的指標,以r所指結點為根節點的樹轉換成雙向鏈表後,鏈表第一個結點的指標first,鏈表最後一個結點的指標last*/void Convert(Node * r,Node * & first,Node * & last){//左子樹和右子樹結果的指標Node *firstL,*lastL,*firstR,*lastR;if(r==NULL) return;Convert(r->left,firstL,lastL);Convert(r->right,firstR,lastR);if(r->left==NULL){/*如果左子樹是空的,那麼以r所指結點為根結點的樹轉換結果的第一個結點的指標就是r*/first=r;r->left=NULL;}else{ /*以r所指結點為根節點的樹轉換成雙向鏈表後,鏈表第一個結點的指標first就是左子樹結果的第一個結點的指標firstL*/first=firstL;/*r->left指向左子樹結果的最後一個結點,同時左子樹最後一個結點的right指標指向r所指結點*/r->left=lastL;lastL->right=r;}if(r->right==NULL){ /*如果右子樹是空的,那麼以r所指結點為根結點的樹轉換結果的最後一個結點的指標就是r*/last=r;r->right=NULL;}else{ /*以r所指結點為根節點的樹轉換成雙向鏈表後,鏈表最後一個結點的指標last就是右子樹結果的最後一個結點的指標lastR*/last=lastR;/*r->right向右子樹結果的第一個結點,同時右子樹第一個結點的right指標指向r所指結點*/r->right=firstR;firstR->left=r;}}