1. 程式人生 > 其它 >Leetcode108. 將有序陣列轉換為二叉搜尋樹

Leetcode108. 將有序陣列轉換為二叉搜尋樹

Leetcode108. 將有序陣列轉換為二叉搜尋樹

題目描述

 /**
     * 
     * 給你一個整數陣列 nums ,其中元素已經按 升序 排列,請你將其轉換為一棵 高度平衡 二叉搜尋樹。
     *
     * 高度平衡 二叉樹是一棵滿足「每個節點的左右兩個子樹的高度差的絕對值不超過 1 」的二叉樹。
     *
     */

思路分析

  1. 整數陣列元素按照升序排列,將其轉換為一棵高度平衡的二叉搜尋樹,平衡即左右子樹高度差最多為1,BST數即左子樹節點值總小於右子樹節點值
  2. 對應於BST樹的中序遍歷結果,因為二叉搜尋樹的中序遍歷結果為一個升序的陣列
  3. 因此可以按照中序遍歷的反向思路,先確定根節點,再確定左右子樹
  4. 取升序陣列中中間偏左的數字為根節點,對於它的左子樹和右子樹使用同樣的思路,則可以使用遞迴實現
  5. 原始碼及詳解見下

原始碼及分析

/**
     * @param nums 升序排列的陣列
     * @return 返回高度平衡的二叉搜尋樹
     */
    public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums, 0, nums.length - 1);
    }




    /**
     * @param nums 升序陣列
     * @param left 左側索引
     * @param right 右側索引
     * @return 中序遍歷的結果是升序的
     */
    public TreeNode helper(int[] nums, int left, int right) {
        //遞迴結束條件
        if (left > right) {
            return null;
        }
        //選擇中間位置左邊的數字作為根節點
        int mid = (left + right) / 2;
        //建立新節點
        TreeNode root = new TreeNode(nums[mid]);
        //遞迴遍歷升序陣列,構建二叉搜尋樹
        root.left = helper(nums, left, mid - 1);
        root.right = helper(nums, mid + 1, right);
        return root;
    }