您的位置:首页 > 其它

LeetCode Convert Sorted Array to Binary Search Tree

2014-12-16 21:08 267 查看

LeetCode Convert Sorted Array to Binary Search Tree

Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

一看题目,就感觉需要用二分法来做,因为数组是排序的,对应生成的树也要是二分搜索树。
具体分许见代码注释

//flag=1表示若此次调用成功,则是root的左子树接点;flag=2表示若此次调用成功,则是root的右子树节点
void ArrayToBST(TreeNode* root, vector<int>& num, int left, int right, int flag)
{
	//left==num.size()/2 || right==num.size(),由于中间节点在程序最开始的时候已经创建,因此这里需要排除,免得重复
	if (left > right || left==num.size()/2 || right==num.size())
		return;

	//创建节点,并挂在root下
	TreeNode* pNode = NULL;
	if (left == right)
	{		
		pNode = new TreeNode(num[left]);
		pNode->left = pNode->right = NULL;
		if (flag == 1)
			root->left = pNode;
		else
			root->right = pNode;
		
		return;
	}
	
	int mid = (left + right) / 2;
	pNode = new TreeNode(num[mid]);
	pNode->left = pNode->right = NULL;
	if (flag == 1)
		root->left = pNode;
	else
		root->right = pNode;

	//构建该节点的左子树
	ArrayToBST(pNode, num, left, mid-1, 1);
	//构建该节点的右子树
	ArrayToBST(pNode, num, mid+1, right, 2);
}

TreeNode *sortedArrayToBST(vector<int> &num)
{
	if (num.size() == 0)
		return NULL;
	
	int n = num.size();
	TreeNode* root = new TreeNode(num[n/2]);
	root->left = root->right = NULL;

	//构建根节点的左子树
	ArrayToBST(root, num, 0, n/2, 1);
	//构建根节点的右子树
	ArrayToBST(root, num, n/2+1, n-1, 2);

	return root;
}


以上代码不够简洁,经过网上的参考,优化之后的代码

TreeNode* buildTree(vector<int> &num, int left, int right)
{
	if (left > right)
		return NULL;

	int mid = left + right / 2;
	TreeNode* leftNode = buildTree(num, left, mid);
	TreeNode* rightNode = buildTree(num, mid + 1, right);

	TreeNode* node = new TreeNode(num[mid]);
	node->left = leftNode;
	node->right = rightNode;

	return node;
}

TreeNode *sortedArrayToBST(vector<int> &num)
{
	return buildTree(num, 0, num.size() - 1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: