1. 程式人生 > >[劍指offer] --26.二叉搜尋樹與雙向連結串列

[劍指offer] --26.二叉搜尋樹與雙向連結串列

題目描述

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

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

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

    }

}
*/
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        
    }
}

解題思路

  • 1.將左子樹構造成雙鏈表,並返回連結串列頭節點。
  • 2.定位至左子樹雙鏈表最後一個節點。
  • 3.如果左子樹連結串列不為空的話,將當前root追加到左子樹連結串列。
  • 4.將右子樹構造成雙鏈表,並返回連結串列頭節點。
  • 5.如果右子樹連結串列不為空的話,將該連結串列追加到root節點之後。
  • 6.根據左子樹連結串列是否為空確定返回的節點。
public class Solution {

    public TreeNode Convert(TreeNode root) {
        if(root==null)
            return null;
        if(root.left==null&&root.right==null)
            return root;
        // 1.將左子樹構造成雙鏈表,並返回連結串列頭節點
        TreeNode left = Convert(root.left);
        TreeNode p = left;
        // 2.定位至左子樹雙鏈表最後一個節點
        while(p!=null&&p.right!=null){
            p = p.right;
        }
        // 3.如果左子樹連結串列不為空的話,將當前root追加到左子樹連結串列
        if(left!=null){
            p.right = root;
            root.left = p;
        }
        // 4.將右子樹構造成雙鏈表,並返回連結串列頭節點
        TreeNode right = Convert(root.right);
        // 5.如果右子樹連結串列不為空的話,將該連結串列追加到root節點之後
        if(right!=null){
            right.left = root;
            root.right = right;
        }
        return left!=null?left:root;
    }

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

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

        }
    }
}