加载中...
面试题 04.02-最小高度树(Minimum Height Tree LCCI)
发表于:2021-12-03 | 分类: 简单
字数统计: 583 | 阅读时长: 2分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/minimum-height-tree-lcci

英文原文

Given a sorted (increasing order) array with unique integer elements, write an algo­rithm to create a binary search tree with minimal height.

Example:

Given sorted array: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5],which represents the following tree: 

          0 
         / \ 
       -3   9 
       /   / 
     -10  5 

中文题目

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

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

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

0
/ \
-3 9
/ /
-10 5

通过代码

高赞题解

首先复习下二叉搜索树的定义:对于树中的所有子树都有,左子树上的值都小于根节点的值,右子树上的值都大于根节点上的值。总结一下就是,树的中序遍历可以得到一个升序序列。

如下图所示:
二叉搜索树.png

那如何保证高度最小呢?当树中的任意结点的左右子树高度差都不超过 1 时,整棵树的深度最小。

下面是一种构造最小高度树的思路:

  1. 如果序列长度为 0,那么是一棵空树。
  2. 如果序列长度为 1,那么只有一个根节点。
  3. 如果长度大于 1,那么选取中间位置的数赋给根节点,然后前一半递归构建左子树,后一半递归构建右子树。

以 [-5,-3,0,1,5,9] 为例,构造过程如下图所示:

构造平衡二叉搜索树.png

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* dfs(const vector<int> &nums, int L, int R) {
        if(L > R) {
            return nullptr;
        }
        int mid = (L+R)>>1;
        auto ptr = new TreeNode(nums[mid]); //填充根节点
        ptr->left = dfs(nums, L, mid-1); //构造左子树
        ptr->right = dfs(nums, mid+1, R); //构造右子树
        return ptr;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return dfs(nums, 0, nums.size()-1);
    }
};

qrcode_for_gh_6e5f8557b1f8_258.jpg

扫码关注,更多福利~

统计信息

通过次数 提交次数 AC比率
36069 45699 78.9%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
面试题 03.05-栈排序(Sort of Stacks LCCI)
下一篇:
面试题 04.03-特定深度节点链表(List of Depth LCCI)
本文目录
本文目录