java 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
阿新 • • 發佈:2019-01-03
題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
比如將二元查詢樹
10
/ \
6 14
/ \ / \
4 8 12 16
轉換成雙向連結串列
4=6=8=10=12=14=16。
/*
1.二叉樹中序遍歷的結果與連結串列的順序一致,所以可以採用中序遍歷的方法來修改二叉樹的指標
2.該題的關鍵是,如何將左子樹的最大值與右子樹的最小值通過根root連線起來,比如題目的8和12,這也是細節部分
3.寫遞迴程式最重要的是弄明白遞迴進入的條件、遞迴返回的狀態,如果遞迴進入時改變了環境,返回時應當恢復環境,就像棧的操作一樣
4.使用指標變數時,要記得初始化
5.該演算法沒有返回連結串列頭,而是返回了root。
*/
以下圖片為測試結果:
public class Solution { public static TreeNode Convert(TreeNode pRootOfTree) { TreeNode lastNode =null; TreeNode headNode=ConvertNode(pRootOfTree, lastNode); while (headNode != null && headNode.left != null) { headNode = headNode.left; } return headNode; } public static TreeNode ConvertNode(TreeNode rootTree, TreeNode lastNode) { if (rootTree == null) { return null; } if (rootTree.left != null) { lastNode=ConvertNode(rootTree.left, lastNode); } rootTree.left = lastNode; if (lastNode != null) { lastNode.right = rootTree; } lastNode = rootTree; if (rootTree.right != null) { lastNode=ConvertNode(rootTree.right, lastNode); } return lastNode; } }