给定一个递增有序数组,要求构建一棵具有最小高度的二叉查找树
题意:给定一个有序整数数组,元素各不相同且按照升序排列,让编写一个算法,创建一个高度最小的二叉查找树
二叉查找树定义:对于任意一个结点,左边的结点均小于它,右边的结点均大于它
思路:要创建一个高度最小的树,就必须让左右子结点的数量越接近越好,也就是说,要让中间值成为根节点,这样,左边的一半是左子树,右边的一半是右子树。然后,继续以类似的方式构造整棵树,数据每一段的中间值成为根元素,左边一半成为左子树,右边一半成为右子树。
递归实现如下:
#include <iostream>
#include<vector>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* CreateMinnumTree(vector<int> &arr, int start, int end)
{
if (start > end)
return NULL;
if (start == end) {
TreeNode* root = new TreeNode(arr[start]);
return root;
}
int mid = (start + end) / 2;
TreeNode* root = new TreeNode(arr[mid]);
root->left = CreateMinnumTree(arr, start, mid - 1);
root->right = CreateMinnumTree(arr, mid + 1, end);
return root;
}
TreeNode* CreateMinnumBSTree(vector<int>& arr) {
if (arr.empty())
return NULL;
return CreateMinnumTree(arr, 0, arr.size() - 1);
}
};
void preOrder(TreeNode* root) {
if (root != NULL)
{
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
}
int main()
{
vector<int> arr = { 1,2,3,4,5,6,7 };
Solution s;
TreeNode* root = s.CreateMinnumBSTree(arr);
preOrder(root);
return 0;
}