1. 程式人生 > >劍指Offer - 二叉搜尋樹與雙向連結串列(Java實現)

劍指Offer - 二叉搜尋樹與雙向連結串列(Java實現)

題目描述:

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

思路分析:
二叉搜尋樹(BST)有一個很關鍵的結論就是:中序遍歷的結果是非遞減(遞增)序列。而本題要求將BST轉換成排序的雙向連結串列,核心就是考察二叉樹的非遞迴中序遍歷方法。需要借用棧空間,並且需要一個變數記錄上一個出棧的元素。

程式碼實現如下:

public class Solution {
    public TreeNode Convert(TreeNode root) {
        if(root == null){
            return null;
        }
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;//記錄當前出棧節點。
        TreeNode pre = null;//記錄上一個出棧節點。
        boolean start = true;//判別第一個出棧節點。
        while( !stack.isEmpty() || cur != null){
            if(cur != null){
                stack.push(cur);
                cur = cur.left;
            }else{
                cur = stack.pop();
                if(start){//記錄第一個出棧的節點。
                    root = cur;
                    pre = cur;
                    start = false;
                }else{
                    cur.left = pre;
                    pre.right = cur;
                    pre = cur;
                }
                cur = cur.right;
            }
        }
        return root;
    } 
}