首页 > 代码库 > [C++]LeetCode: 100 Convert Sorted Array to Binary Search Tree (AVL树)

[C++]LeetCode: 100 Convert Sorted Array to Binary Search Tree (AVL树)

题目: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;
    }
};




[C++]LeetCode: 100 Convert Sorted Array to Binary Search Tree (AVL树)