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

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

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

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

  0
 /
 -3   9
  /     /
-10 5

思路:很明显有序数组即二叉树的中序排列,那么这题就变成了如何由一个中序排列复原出一个二叉平衡树。然而,我不会。。。。

solution:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* sortedArrayToBST(vector<int>& nums) {
13       return sortedArrayToBST(nums,0,nums.size()-1);
14     }
15 private:
16   TreeNode* sortedArrayToBST(vector<int>&nums,int start,int end)
17   {
18     if(start > end) return nullptr;
19     int mid = start + (end- start)/2;
20     TreeNode* root = new TreeNode(nums[mid]);
21     root->left = sortedArrayToBST(nums,start,mid-1);
22     root->right = sortedArrayToBST(nums,mid+1,end);
23     return root;
24   }
25 };

反思:关于二叉搜索树的:

二叉搜索树是一种用于快速搜索的数据结构,定义为:左孩子上所有节点均小于右孩子上的(使用中序遍历出来的序列一定有序)。对于平衡二叉搜索树,是在二叉搜索树的一种改进,是为了防止我们查找次数过多(节点两边不平衡,一边过少,导致树很高,但节点不多,有很多空指针),所有我们要限制树,使其能更加紧凑,每个节点左右两边节点数目差不多(严格定义是左右相差不能超过1)。

在有中序的情况下,配合前序或后序都可以复原二叉树。

(太耻辱了,我这个大学计算机算是白读了,什么东西都没学会,真的现在开始还债了。)

原文地址:https://www.cnblogs.com/Swetchine/p/11273281.html