二叉樹轉雙向鏈表問題


問題由來:

輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。

要求不能創建任何新的結點,只調整指針的指向。

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 }


免責聲明!

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



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