程序员面试金典-面试题 04.02. 最小高度树

题目:

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

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

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

  0
  / \
 -3   9
 /     /
-10  5

分析:

因为数组中元素已经有序,我们可以将数组中最中间的元素作为根节点,然后递归构建二分搜索树,当前结点的左子树由中间元素左边的的元素构成,右子树则由右边元素,递归构建即可。

程序:

/**
 * 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) {
        return insert(nums, 0, nums.length-1);
    }
    private TreeNode insert(int[] nums, int l, int r) {
        if(l > r)
            return null;
        if(l == r)
            return new TreeNode(nums[l]);
        int mid = l + (r - l) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = insert(nums, l, mid-1);
        node.right = insert(nums, mid+1, r);
        return node;
    }

}

原文地址:https://www.cnblogs.com/silentteller/p/12426353.html

时间: 2024-09-27 23:34:07

程序员面试金典-面试题 04.02. 最小高度树的相关文章

程序员面试金典-面试题 04.05. 合法二叉搜索树

题目: https://leetcode-cn.com/problems/legal-binary-search-tree-lcci/ 实现一个函数,检查一棵二叉树是否为二叉搜索树. 示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4  / \  3 6输出: false解释: 输入为: [5,1,4,null,null,3,6].  根节点的值为 5 ,但是其右子节点值为 4 . 分析: 两种做法,利用二分搜索树中序遍历的性质,节点val值的顺序应该是严格

程序员面试金典-面试题 02.04. 分割链表

题目: 编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前.如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示).分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间. 示例: 输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8 分析: 可以新建两个链表存储小于x的节点和大于等于x的节点,然后再将

程序员面试金典-面试题 17.04. 消失的数字

题目: 数组nums包含从0到n的所有整数,但其中缺了一个.请编写代码找出那个缺失的整数.你有办法在O(n)时间内完成吗? 注意:本题相对书上原题稍作改动 示例 1: 输入:[3,0,1] 输出:2 示例 2: 输入:[9,6,4,2,3,5,7,0,1] 输出:8 分析: 先利用高斯求和,然后依次减去数组中的每一个元素,剩下的值就是缺失值. 程序: class Solution { public int missingNumber(int[] nums) { int sum = (0 + nu

程序员面试金典-面试题 01.01. 判定字符是否唯一

题目: https://leetcode-cn.com/problems/is-unique-lcci/ 实现一个算法,确定一个字符串 s 的所有字符是否全都不同. 示例 1: 输入: s = "leetcode"输出: false 示例 2: 输入: s = "abc"输出: true限制: 0 <= len(s) <= 100如果你不使用额外的数据结构,会很加分. 分析: 哈希做法,开辟数组,统计对应位置的字符出现数量,遍历字符串,当数量为1时,表示

程序员面试金典-面试题 01.06. 字符串压缩

题目: https://leetcode-cn.com/problems/compress-string-lcci/ 字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若“压缩”后的字符串没有变短,则返回原先的字符串.你可以假设字符串中只包含大小写英文字母(a至z). 示例1: 输入:"aabcccccaaa" 输出:"a2b1c5a3"示例2: 输入:"abbccd&qu

程序员面试金典-面试题 16.05. 阶乘尾数

题目: 设计一个算法,算出 n 阶乘有多少个尾随零. 示例 1: 输入: 3输出: 0解释: 3! = 6, 尾数中没有零.示例 2: 输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) . 分析: 计算阶乘后0的个数实际上就是在数5,一个5和一个偶数相乘就会产生一个0,而25会产生两个0,所以对于n大于0时,数它的5有多少个,除以5,如果还大于0就继续除以5,也就是在数25有几个,反复执行下去. 程序: class Soluti

程序员面试金典-面试题 16.20. T9键盘

题目: 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表.每个数字映射到0至4个字母.给定一个数字序列,实现一个算法来返回匹配单词的列表.你会得到一张含有有效单词的列表.映射如下图所示: 示例 1: 输入: num = "8733", words = ["tree", "used"] 输出: ["tree", "used"] 示例 2: 输入: num = "2"

LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)

LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) 剑指Offer 数据结构 链表 序号 题目 难度 06 从尾到头打印链表 简单 18 删除链表的节点 简单 22 链表中倒数第k个节点 简单 二叉树 序号 题目 难度 07 重建二叉树 中等 栈和队列 序号 题目 难度 09 用两个栈实现队列 简单 图 序号 题目 难度 12 矩阵中的路径 中等 13 机器人的运动范围 中等 算法 动态规划 序号 题目 难度 10- I 斐波那契数列 简单 10- II 青蛙跳台阶问题 简单 查找

【程序员面试金典】面试题 01.03. URL化

题目 URL化.编写一种方法,将字符串中的空格全部替换为%20.假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的"真实"长度.(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作.) 示例1: 输入:"Mr John Smith ", 13 输出:"Mr%20John%20Smith" 示例2: 输入:" ", 5 输出:"%20%20%20%20%20" 提示: 字符串长度在[0,