1. 程式人生 > >(不懂)二叉搜尋樹與雙向連結串列

(不懂)二叉搜尋樹與雙向連結串列

 

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

public class Solution {
   private TreeNode pre = null;   //上一個節點
private TreeNode head = null;      //當前節點

public TreeNode Convert(TreeNode root) {
    inOrder(root);
    return head;
}

private void inOrder(TreeNode node) { //輸入一個 node
    if (node == null)   //判空
        return;
    inOrder(node.left);  // 左孩子遞迴
    node.left = pre;     // 上個節點賦值給 left
    if (pre != null)    //如果上個節點不為空
        pre.right = node;    //node 給
    pre = node;
    if (head == null)
        head = node;
    inOrder(node.right);
}
}


解題思路:
1.核心是中序遍歷的非遞迴演算法。
2.修改當前遍歷節點與前一遍歷節點的指標指向。
    import java.util.Stack;
    public TreeNode ConvertBSTToBiList(TreeNode root) {
        if(root==null)   //判空
            return null;
        Stack<TreeNode> stack = new Stack<TreeNode>();  //使用系統的棧
        TreeNode p = root;   //當前的節點宣告變數 p
        TreeNode pre = null;// 用於儲存中序遍歷序列的上一節點
        boolean isFirst = true;  //宣告一個 boolean 變數,初始值為 true
        while(p!=null||!stack.isEmpty()){ //  當 p 不為空或者 棧不為空時,迴圈
            while(p!=null){          // 當 p 不為空時,
                stack.push(p);       // 新增元素的方法push(),新增到棧裡
                p = p.left;          //把 p 的左孩子賦值給 p
            }
            p = stack.pop();        //當遍歷到葉子節點時,即 p 為 空,彈出棧的棧頂元素,賦值為 p
            if(isFirst){
                root = p;// 將中序遍歷序列中的第一個節點記為root
                pre = root;
                isFirst = false;
            }else{
                pre.right = p;
                p.left = pre;
                pre = p;
            }      
            p = p.right;
        }
        return root;
    }

對於當前結點,先輸出它的左孩子,然後輸出該結點,最後輸出它的右孩子。(left—