创建二叉平衡树

题目


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

分析


高度最小的二叉查找树,显然只能是二叉平衡树。那么如何根据升序数组建立二叉平衡树,很简单,只需找到中间节点作为根,同理递归建立左右子树即可。

代码

/*
题目描述

对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。
给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。
*/

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
		val(x), left(NULL), right(NULL) {
	}
};

class MinimalBST {
public:
	int buildMinimalBST(vector<int> vals) {
		// write code here
		if (vals.empty())
			return 0;
		int height = 0;
		createMinimalBST(vals, height);
		return height;
	}

	/*递归求高度*/
	int getHeight(TreeNode *root)
	{
		if (!root)
			return 0;
		else
			return max(getHeight(root->left), getHeight(root->right)) + 1;
	}

	/*建立最矮二叉树,同时更新高度*/
	TreeNode *createMinimalBST(vector<int> vals , int &height)
	{
		if (vals.empty())
		{
			height = 0;
			return NULL;
		}
		int lhs = 0, rhs = vals.size();
		TreeNode *root = new TreeNode(vals[(lhs + rhs) / 2]);
		int leftHeight, rightHeight;
		root->left = createMinimalBST(vector<int>(vals.begin(), vals.begin() + ((lhs + rhs) / 2)),leftHeight);
		root->right = createMinimalBST(vector<int>(vals.begin() + ((lhs + rhs) / 2 + 1), vals.end()),rightHeight);

		height = max(leftHeight, rightHeight) + 1;
		return root;
	}
};

int main()
{
	MinimalBST m;
	vector<int> v = { 1, 2, 3, 4, 5, 6, 7 }; 
	int height = 0;
	TreeNode *root = m.createMinimalBST(v,height);

	system("pause");
	return 0;
}




已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页