1. 程式人生 > >java 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

java 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

題目描述

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

比如將二元查詢樹
                                            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;
		}

}