题目链接:108. 将有序数组转换为二叉搜索树
标签:树、二叉搜索树、数组、分治、二叉树
方法一:中序遍历,总是选择中间位置左边的数字作为根节点
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode tree = formTree(nums,0,nums.length-1);
return tree;
}
public TreeNode formTree(int[] nums, int left, int right) {
if (left > right) {
return null;
}
// 总是选择中间位置左边的数字作为根节点
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = formTree(nums, left, mid - 1);
root.right = formTree(nums, mid + 1, right);
return root;
}
}
方法一:中序遍历,总是选择中间位置右边的数字作为根节点
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode tree = formTree(nums,0,nums.length-1);
return tree;
}
public TreeNode formTree(int[] nums, int left, int right) {
if (left > right) {
return null;
}
// 总是选择中间位置右边的数字作为根节点
int mid = (left + right + 1) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = formTree(nums, left, mid-1);
root.right = formTree(nums, mid+1, right);
return root;
}
}
方法三:中序遍历,选择任意一个中间位置数字作为根节点
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode tree = formTree(nums,0,nums.length-1);
return tree;
}
public TreeNode formTree(int[] nums, int left, int right) {
Random rand = new Random();
if (left > right) {
return null;
}
// 总是选择中间位置右边的数字作为根节点
int mid = (left + right + rand.nextInt(2)) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = formTree(nums, left, mid-1);
root.right = formTree(nums, mid+1, right);
return root;
}
}