LeetCode-108-將有序陣列轉換為二叉搜尋樹

雄獅虎豹發表於2021-11-22

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

題目描述:給你一個整數陣列 nums ,其中元素已經按 升序 排列,請你將其轉換為一棵 高度平衡 二叉搜尋樹。

高度平衡 二叉樹是一棵滿足「每個節點的左右兩個子樹的高度差的絕對值不超過 1 」的二叉樹。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:遞迴

根據二叉搜尋樹的性質,因為給定的陣列是按升序排列的,所以可以確定陣列num即為該二叉搜尋樹的中序遍歷序列,為了得到一顆平衡的二叉樹,取陣列中間位置的節點作為根節點,這樣,左右子樹的節點較為平衡,具體處理過程如下:

  • 呼叫遞迴方法,初始的起始位置為陣列的長度;
  • 當起點位置大於終點位置時,說明節點已經遍歷完了,直接返回空樹;
  • 獲取中間位置的值作為根節點,這樣左右子樹的節點樹是比較均衡的;
  • 然後遞迴獲得當前根節點的左右子樹;
  • 最後返回根節點即為平衡的二叉搜尋樹。
import com.kaesar.leetcode.TreeNode;

public class LeetCode_108 {
    public static TreeNode sortedArrayToBST(int[] nums) {
        // 呼叫遞迴方法,初始的起始位置為陣列的長度
        return sortedArrayToBST(nums, 0, nums.length - 1);
    }

    /**
     * 遞迴
     *
     * @param nums
     * @param left
     * @param right
     * @return
     */
    private static TreeNode sortedArrayToBST(int[] nums, int left, int right) {
        // 當起點位置大於終點位置時,說明節點已經遍歷完了,直接返回空樹
        if (left > right) {
            return null;
        }
        // 獲取中間位置的值作為根節點,這樣左右子樹的節點樹是較為平衡點
        int mid = (left + right) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        // 然後遞迴獲得當前根節點的左右子樹
        root.left = sortedArrayToBST(nums, left, mid - 1);
        root.right = sortedArrayToBST(nums, mid + 1, right);
        return root;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{-10, -3, 0, 5, 9};
        sortedArrayToBST(nums).print();
    }
}
【每日寄語】 不辜負每個朝陽,不荒廢每個深夜,因平凡而奮鬥,因奮鬥而不平凡。

相關文章