Leetcode108. 將有序陣列轉換為二叉搜尋樹
阿新 • • 發佈:2021-09-07
Leetcode108. 將有序陣列轉換為二叉搜尋樹
題目描述
/**
*
* 給你一個整數陣列 nums ,其中元素已經按 升序 排列,請你將其轉換為一棵 高度平衡 二叉搜尋樹。
*
* 高度平衡 二叉樹是一棵滿足「每個節點的左右兩個子樹的高度差的絕對值不超過 1 」的二叉樹。
*
*/
思路分析
- 整數陣列元素按照升序排列,將其轉換為一棵高度平衡的二叉搜尋樹,平衡即左右子樹高度差最多為1,BST數即左子樹節點值總小於右子樹節點值
- 對應於BST樹的中序遍歷結果,因為二叉搜尋樹的中序遍歷結果為一個升序的陣列
- 因此可以按照中序遍歷的反向思路,先確定根節點,再確定左右子樹
- 取升序陣列中中間偏左的數字為根節點,對於它的左子樹和右子樹使用同樣的思路,則可以使用遞迴實現
- 原始碼及詳解見下
原始碼及分析
/** * @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; }