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

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

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

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


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

递归实现如下:

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

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/YF_Li123/article/details/77454062
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞