(算法整理)排序数组转平行二叉树(leetcode 108)

leetcode 108 排序数组转平行二叉树

算法描述:已知一个排序数组,现需要将其转化为一个高度平衡的二叉查找树。(平衡二叉树的定义:二叉树中,任意两个节点的高度差小于等于1)

思考:将排序数组转化为高度平衡的二叉查找树,关键在于数据元素插入的二叉树的顺序

结论:每次选取数组的“中间元素”插入二叉树,完成选择后,再将数组划分为左右两个数组(类似于二分查找),再递归地处理这两个子数组,继续选择中间元素进行尝试。

算法设计:设计递归函数preorder_insert用于对排序数组nums做划分,同时每次寻找中间的数据nums[mid],其中mid=(begin+end)/2,将中间数据生成二叉树结点,保存至node_vec中。

void preorder_insert(const std::vector<int> nums, std::vector<TreeNode*> &node_vec, int begin, int end) {
	if (begin > end)
	{
		return;
	}
	int mid = (begin + end) / 2;
	node_vec.push_back(new TreeNode(nums[mid]));
	preorder_insert(nums, node_vec, begin, mid - 1);
	preorder_insert(nums, node_vec, mid + 1, end);
}

TreeNode* sortArray2BST(const std::vector<int> nums) {
	if (nums.size() == 0)
	{
		return NULL;
	}
	std::vector<TreeNode*> node_vec;
	preorder_insert(nums, node_vec, 0, nums.size() - 1);
	for (int i = 1; i < node_vec.size(); i++)
	{
		BST_insert_loop(node_vec[0], node_vec[i]);
	}
	return node_vec[0];
}

其中BST_insert_loop方法是二叉查找树插入节点的函数,实现如下:

void BST_insert_loop(TreeNode* node, TreeNode* insert_node) {
	while (node != insert_node)
	{
		if (insert_node->val < node->val)
		{
			if (!node->left)
			{
				node->left = insert_node;
			}
			node = node->left;
		}
		else
		{
			if (!node->right)
			{
				node->right = insert_node;
			}
			node = node->right;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值