给定一个递增有序数组,要求构建一棵具有最小高度的二叉查找树

来源:互联网 发布:淘宝网的鞋子 编辑:程序博客网 时间:2024/04/28 13:07
 给定一个递增有序数组,要求构建一棵具有最小高度的二叉查找树 

题意:给定一个有序整数数组,元素各不相同且按照升序排列,让编写一个算法,创建一个高度最小的二叉查找树

二叉查找树定义:对于任意一个结点,左边的结点均小于它,右边的结点均大于它


思路:要创建一个高度最小的树,就必须让左右子结点的数量越接近越好,也就是说,要让中间值成为根节点,这样,左边的一半是左子树,右边的一半是右子树。然后,继续以类似的方式构造整棵树,数据每一段的中间值成为根元素,左边一半成为左子树,右边一半成为右子树。

递归实现如下:

#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;}


阅读全文
1 0