list_from_tree 是「樹轉列表」,非「建樹」代碼中的 list_from_tree 函數**不是構建二叉樹**,而是將已建好的二叉樹,按 **右-根-左** 的逆中序遍歷順序,轉換為單向鏈表。主函數中樹的建立是靠 new_tnode 手動串聯完成的。
Lnode *list_from_tree(Tnode *root, Lnode *list) {
if (root == NULL) return list; // 終止條件:空節點直接返回當前列表尾部
// 1. 先處理右子樹,返回右子樹轉換後的列表頭(即當前子樹中最大值節點)
Lnode *right = list_from_tree(root->right, list);
// 2. 建立當前根節點對應的鏈表節點,接在右子樹列表之後
Lnode *new = new_node(root->data);
new->next = right;
// 3. 處理左子樹,將新節點作為左子樹轉換的「尾部」傳入
// 左子樹所有節點值均小於根節點,應排在根節點之前
Lnode *left = list_from_tree(root->left, new);
return left; // 返回整個子樹轉換後的列表頭(最小值節點)
}
6
/ \
5 8
/ \
7 9
9:右子樹為空,返回 list (NULL) → 建節點 9 → 左子樹空 → 返回 9。8:右子樹返回 9 → 建節點 8 → 8->next=9 → 遞歸左子樹 7 → 返回 7->8->9。6:右子樹返回 7-8-9 → 建節點 6 → 6->next=7 → 遞歸左子樹 5 → 返回 5-6-7-8-9。最終鏈表順序:5 → 6 → 7 → 8 → 9(升序),完美對應二叉搜尋樹的中序遍歷。
list 代表「已構建部分的列表尾部」:遞歸時層層傳遞,實現「就地拼接」,無需額外合併步驟。prev 指針,遞歸時同步維護。這段代碼展示了指針操作與遞歸思維的完美結合,是掌握樹形結構轉換的經典教材。