將有序陣列轉換為二叉搜尋樹
題目描述:給你一個整數陣列 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();
}
}
【每日寄語】 不辜負每個朝陽,不荒廢每個深夜,因平凡而奮鬥,因奮鬥而不平凡。