zoukankan      html  css  js  c++  java
  • 面试题 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...
  • 相关阅读:
    C#基础知识之GC 垃圾回收
    获取地址栏参数并转化为对象
    input type属性为number时,去掉右边的上下箭头
    vscode用服务打开html
    富文本的原理和插件使用
    原生js拖拽、jQuery拖拽、vue自定义指令拖拽
    js的call()方法
    js继承
    网页禁止复制和解除禁止复制
    ES6-解构赋值
  • 原文地址:https://www.cnblogs.com/ly-leah/p/13512050.html
Copyright © 2011-2022 走看看