LeetCode Convert Sorted Array to Binary Search Tree

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值