题目:Given an array where elements are sorted in ascending order, convert it to a height balanced
BST.
思路:给出一个排序的数组,如何构造一个平衡二叉查找树?平衡二叉查找树要求任一结点的左右子树的高度差不能超过一,也叫做高度平衡树。如果让我们从一个排序数组中选取一个元素做树的根,我们会选择哪一个树呢?凭直觉,我们觉得应该选择数组的中间值做根,事实也是这样,平衡二叉查找树(AVL树)的根应该是排序数组的中间元素。(我们把排序数组的中间节点作为根,可保证左右子树的元素个数差不超过1,则肯定是平衡二叉树。但并不是唯一的AVL树,不过工程中这种选择中间节点做根的查找树很常用,方便二分查找。)我们用这个元素创建树的根结点,接下来剩下左右两部分的数组,继续选择中间元素,进行递归,左子树的根应该是左部分数组的中间元素,同理右子树的根也是右部分数组的中间元素。利用了分而治之的方法,不断解决子问题。
Attention:
1. 递归终止条件,start > end, 返回NULL. 也包含了数组为空的情况(start = 0, end = -1)。
AC Code:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode *sortedArrayToBST(vector<int> &num) { return sortedArrayToBST_helper(num, 0, num.size()-1); } private: TreeNode* sortedArrayToBST_helper(vector<int> &num, int start, int end) { if(start > end) return NULL; int mid = start + (end - start)/2; TreeNode* root = new TreeNode(num[mid]); root->left = sortedArrayToBST_helper(num, start, mid-1); root->right = sortedArrayToBST_helper(num, mid+1, end); return root; } };
时间: 2024-10-05 16:39:27