LeetCode——第108題:將有序數組轉化爲二叉搜索樹

題目:

將一個按照升序排列的有序數組,轉換爲一棵高度平衡二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定有序數組: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

0
/ \
-3 9
/ /
-10 5

代碼:

/**
 * @作者:dhc
 * @創建時間:18:58 2018/7/31
 * @描述:108.將有序數組轉化爲二叉搜索樹
 */
public class OneHundredAndEight {
    //思路:首先找出序列中位數,作爲root結點,然後遞歸建立,數組的前半部分返回一個二叉搜索樹
    //這個返回的二叉搜索樹的根節點爲當前root的左子樹,同理右子樹
    public static TreeNode sortedArrayToBST(int[] nums) {
        return getSubNode(nums,0,nums.length - 1);
    }
    public static TreeNode getSubNode(int[] nums, int l, int r){
        //對於只有左結點的結點,它的這個左結點的l==r,因此直接返回(因爲是平衡樹)
        if (r == l) {
            return new TreeNode(nums[l]);
        }
        //一開始沒考慮,後來調試,發現對於對於只有左結點的結點,它的l會比r大1,並且最由的那個結點的l==nums.length
        //神煩這種條件
        if(l > r && r + 1 == l || l == nums.length){
            return null;
        }
        //一開始用(r-l)/2,後來在根結點的右子樹上會出錯,在右子樹這邊還需要加上l,遞歸不好寫
        int m = (r + l)/2;
        TreeNode root = new TreeNode(nums[m]);
        root.left = getSubNode(nums,l,m-1);
        root.right = getSubNode(nums, m+1, r);
        return root;
    }

    //中序遍歷驗證結果
    public static void midPrint(TreeNode root) {
        if(root != null){
            midPrint(root.left);
            System.out.print(root.val+" ");
            midPrint(root.right);
        }
    }
    public static void main(String[] args) {
        int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        TreeNode root = sortedArrayToBST(nums);
        midPrint(root);
    }
}
發佈了75 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章