面试题 04.02.最小高度树
难度 简单
题目描述:给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树(BST)
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/
-3 9
/ /
-10 5
题目链接:
我的题解
有序数组对半分,num[mid]为root节点,左边子数组为左子树,右边子数组为右子树,通过递归给 root.left 和 root.right 赋值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
int length = nums.length;
if (length == 0)
return null;
int mid = length / 2;
TreeNode root = new TreeNode(nums[mid]);
if (length == 1)
return root;
if (length == 2){
root.left = new TreeNode(nums[0]);
return root;
}
if (length == 3){
root.left = new TreeNode(nums[0]);
root.right = new TreeNode(nums[2]);
return root;
}
root.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, mid));
root.right = sortedArrayToBST(Arrays.copyOfRange(nums, mid+1, length));
return root;
}
}
在递归之前先判断nums的长度是否满足条件,如果满足,执行相关操作,否则,继续将数组切片递归。
符合二叉树的框架:先明确一个节点要做的事情,剩下的事情抛给框架。
参考:labuladong的算法小抄
/*
* 二叉树算法的设计总路线:明确一个节点要做的事情,然后剩下的事抛给框架
*/
void traverse(TreeNode root) {
// root 需要做什么?在这做
// 其他的不同root操心,抛给框架
traverse(root.left);
traverse(root.right);
}
Java数组切片
Arrays.copyOfRange(array, from, to),截取索引from(包括)到to(不包括)的元素。
public class test {
public static void main(String[] args) {
int a[] = new int[] { 10, 5, 3, 2, 6, 8, 7, 9, 1, 4 };
int b[] = Arrays.copyOfRange(a, 2, 6);// 截取索引2(包括)到索引6(不包括)的元素
System.out.println(Arrays.toString(b));
}
输出:[3,2,6,8]
参考题解
二分思想+递归
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return helper(nums,0,nums.length);
}
private TreeNode helper(int[] nums,int left,int right){
if(left==right){
return null;
}
int mid = (left+right)/2;
TreeNode node = new TreeNode(nums[mid]);
node.left = helper(nums,left,mid);
node.right = helper(nums,mid+1,right);
return node;
}
}
相似题目:
思考
对比大佬的代码,自己的代码确实繁琐了一些。一开始想到了要用一个helper,第一反应helper的传入参数是两个数组,打了草稿后感觉又用不上了...还是要多学习大佬的代码啊。