1. 程式人生 > >26.二叉搜索樹與雙向鏈表

26.二叉搜索樹與雙向鏈表

lin 分析 不能 雙向 鏈表 序列 queue oid !=

題目描述:

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

思路分析:

??要將二叉搜索樹轉換為一個排序的雙向鏈表,且不能創建新的節點。首先要求是排序的,那麽由於二叉搜索樹的特殊性,只要我們中序遍歷二叉樹,就能得到有序序列,然後我們可以將每個節點的指向左右孩子的指針,改成指向前節點和後節點。這樣就可以實現題目要求,我們可以先用隊列保存中序遍歷後節點的順序。然後改變每個節點的left,right指針,得到排序的雙向鏈表。

代碼:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.*;
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        //第一步;先將中序遍歷的節點保存在隊列中
        Queue<TreeNode>q=new LinkedList<>();
        saveNodes(pRootOfTree,q);
        if(q.isEmpty())
            return null;
        TreeNode pNode=q.poll();
        TreeNode root=pNode;    //保存鏈表頭
        TreeNode pre=pNode;
        pre.left=null;          //鏈表頭的前指針為空
        while(!q.isEmpty()){
            pNode=q.poll();
            pre.right=pNode;
            pNode.left=pre;
            pre=pNode;
        }
        return root;
    }
    public void saveNodes(TreeNode root,Queue<TreeNode>q){
        if(root!=null){
        saveNodes(root.left,q);
        q.offer(root);
        saveNodes(root.right,q);
        }
    }
}

26.二叉搜索樹與雙向鏈表