面试题 04.02.最小高度树

面试题 04.02.最小高度树

难度 简单

题目描述:给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树(BST)

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0 
     / \ 
   -3   9 
   /   / 
 -10  5 
题目链接:

力扣(LeetCode):面试题 04.02.最小高度树

我的题解


有序数组对半分,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;
    }
}

相似题目:

108.将有序数组转换为二叉树

思考

对比大佬的代码,自己的代码确实繁琐了一些。一开始想到了要用一个helper,第一反应helper的传入参数是两个数组,打了草稿后感觉又用不上了...还是要多学习大佬的代码啊。

TO BE CONTINUED...
posted @ 2020-08-16 12:03  Haloya  阅读(139)  评论(0编辑  收藏  举报