力扣第105题,从前序和中序构造二叉树

思路:
参数:前序序列,中序序列,和两个序列的范围,表示这个树所有结点
根据前序,可以知道开始位置就是根结点,然后再中序里面寻找根结点的位置,记住位置root_pos,
根结点左边的都是左子树结点,左子树结点个数left_Num=root_pos - in_start;
TreeNode *root= new TreeNode(pre[p_start])
递归建立左子树 前序序列的左子树范围就是pre_start+1~pre_start+1+leftNum
中序序列的左子树范围就是in_start~root_pos
递归建立右子树,前序序列的右子树范围就是pre_start+1+leftNum~pre_end
中序序列的右子树范围就是root_pos+1~in_end

在中序序列中查找根结点时,避免遍历,可以使用哈希表

class Solution {
public:
	TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
		unordered_map<int, int> map;
		for (int i = 0; i < inorder.size(); i++)
		{
			map.insert(make_pair(inorder[i],i));
		}
		return build(preorder, 0, preorder.size(), inorder, 0, inorder.size(),map);
	}
	//pre_start前序的开始,p_end结束,包括左,不包括右
	TreeNode* build(vector<int>& pre, int p_start, int p_end,
		vector<int>& in, int i_start, int i_end,unordered_map<int, int> &map)
	{
		if (p_start == p_end){
			return NULL;
		}
		int root_val = pre[p_start];
		TreeNode *root = new TreeNode(root_val);
		//利用哈希表在中序中,寻找root_val的值
		int root_pos = map[root_val];
		//左子树的个数
		int left_Num = root_pos - i_start;
		root->left = build(pre, p_start + 1, p_start + left_Num + 1, in, i_start, root_pos,map);
		root->right = build(pre, p_start + left_Num + 1, p_end, in, root_pos+1, i_end, map);
		return root;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值