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)。
在有中序的情况下,配合前序或后序都可以复原二叉树。
(太耻辱了,我这个大学计算机算是白读了,什么东西都没学会,真的现在开始还债了。)