劍指offer之二叉搜索樹與雙向鏈表

將二叉搜索樹轉爲排序的雙向鏈表

原題:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

/*
 * 遞歸方法:
 * 由於題目要求排序的雙向列表,所以首先將二叉搜索樹中序遍歷,這裏採用一個隊列來存放要排序的節點,每訪問一個節點將其
 * 入隊,最後全部入隊後隊列裏面是排好序的節點,隊首是值最小的節點。然後開始出隊,每出隊一個元素,將該元素的right指向
 * 隊首元素,將隊首元素的left指向剛纔出隊的那個元素。直到隊列中只有1個元素時,這時雙向列表已經已經鏈接好了,但是題目裏面唯一
 * 提供的一個引用還在鏈表尾部,所以再將該引用通過循環指向雙向鏈表頭部那個最小的節點並返回,OK,我的這種方法應該是比較好理解的。
 */
import java.util.LinkedList;
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        //創建一個空隊列
        LinkedList<TreeNode> queue=new LinkedList<TreeNode>();

        if(pRootOfTree==null) return null;
        else inRootTraverse(pRootOfTree, queue);

        while(queue.size()>1){
            pRootOfTree=queue.poll();//隊首節點出隊
            pRootOfTree.right=queue.peek();
            queue.peek().left=pRootOfTree;
        }
        //由於題目不讓創建新的節點,而現在題目提供的引用指向列表尾部,所以只能將提供的引用指向鏈表首部
        while(pRootOfTree.left!=null) pRootOfTree=pRootOfTree.left;

        return pRootOfTree;
    }
    //中序遍歷二叉搜索樹
    public void inRootTraverse(TreeNode root,LinkedList<TreeNode> queue){
        if(root!=null){
            inRootTraverse(root.left, queue);
            queue.add(root);//入隊
            inRootTraverse(root.right, queue);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章