面试题 04.02. 最小高度树(C++)

题目

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

示例:

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

分析与题解

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

为保证树的高度最小,当树中的任意结点的左右子树高度差都不超过 1 时,整棵树的深度最小。下面是一种构造最小高度树的思路:

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

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

image-20200908205753371

需要注意的是,本例中当vector中元素个数为偶数时,代码中默认使用左侧的中间数为根结点构建树,即使用整数除法进行下取整。

同一个输入构造的二叉搜索树不唯一,因此输出结果与笔者不同仍可能AC

/**
 * 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* createTree(vector<int>& nums, int left, int right){
        if(left>right)
            return nullptr;
        int mid = (left + right) / 2;
        TreeNode* p = new TreeNode(nums[mid]);
        p->left = createTree(nums, left, mid-1);
        p->right = createTree(nums, mid+1, right);
        return p;
    }
    //形参的vector为了减少复制副本数量,一般都
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int len = nums.size();
        return createTree(nums, 0, len-1 );
    }
};
posted @ 2020-09-08 21:01  脱线森林`  阅读(163)  评论(0编辑  收藏  举报