package org.example.interview.practice; /** * @author xianzhe.ma * @date 2021/8/18 * 升序数组转二叉平衡树 */ public class NC_11_SORTEDARRAY_2_BST { public TreeNode sortedArrayToBST (int[] nums) { // 判断特殊情况, 数组为空,或数组上没有元素,直接返回 null if (nums == null || nums.length == 0) { return null; } return process(nums, 0, nums.length - 1); } /** * * @param nums 整个的有序数组 * @param left 数组的左边界, 闭区间 * @param right 数组的右边界, 闭区间 * @return nums[left ... right] 这个范围的数组,转成 BST 后的根节点 */ public TreeNode process(int[] nums, int left, int right) { // 左边界 比 右边界 大, 说明数组上没有元素,直接返回 null if (left > right) { return null; } // 如果只有一个元素,就把它当成根节点直接返回 if (left == right) { TreeNode root = new TreeNode(nums[left]); return root; } // nums[left ... right] 这个数组的长度 int len = right - left + 1; // nums[left ... right] 这个数组的中点下标,这个下标里的元素值就是 BST 的根节点的值 int mid = left + len / 2; TreeNode root = new TreeNode(nums[mid]); // 找出根节点的左子树: 继续递归用这个方法,找出左子树上这个局部范围的BST的根节点 root.left = process(nums, left, mid - 1); // 找出根节点的右子树: 继续递归用这个方法,找出右子树上这个局部范围的BST的根节点 root.right = process(nums, mid + 1, right); return root; } public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } }