問題由來:
輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。
要求不能創建任何新的結點,只調整指針的指向。
10
/ /
6 14
/ / / /
4 8 12 16
轉換成雙向鏈表
4=6=8=10=12=14=16。
————————————————————————————————————————————————————————
查詢了一些資料,有人說這問題就是二叉樹的線索化過程。這里我個人覺得不是。理由如下:
1、線索二叉樹中,確實其中存在的是雙向線索鏈表,理解為一種需要簡單處理的雙向線索鏈表;(如:當右指針為線索時,直接繼承后繼,如果右指針為子樹時,需要遞歸找尋右子樹的最左邊子節點的處理)
2、雙向鏈表,理解為直接繼承后繼,一直到鏈表為空。簡單的后繼后繼就成的。
3、構建過程也不一樣:
(3.1 )二叉樹線索化的思想: 保存兩個關鍵的指針:pre指針(上一次訪問的指針)和current指針;當current->lchild為空時,current->lchild = pre; 當pre ->rchild為空時,pre->rchild = current; 然后,執行pre = current;當中序遍歷結束時,二叉搜索樹也被線索化了。
(3.2 )二叉樹轉換為雙向鏈表的思想: 保存兩個關鍵的指針:pre指針(上一次訪問的指針)和T指針;對於每一個節點,執行T->lchild = prepre;pre->rchild = T; 然后執行pre = T;當中序遍歷結束時,二叉搜索樹也被轉化為雙鏈表了。
————————————————————————————————————————————————————————
下面貼出兩者的代碼
1 void BiTreeToLinklist(BiTree &T) // change tree to linklist 2 { 3 if(T != NULL) // 雙向鏈表化 4 { 5 BiTreeToLinklist(T->lchild); 6 T->lchild = pre; 7 pre->rchild = T; 8 pre = T; 9 BiTreeToLinklist(T->rchild); 10 } 11 }
