leetcode 105 学习笔记(从前序和中序遍历构造二叉树)

105. 从前序与中序遍历序列构造二叉树

问题描述:传送门

在这里插入图片描述

思路:

和前面学过的leetcode 105一样,思路一致。

前序和中序、中序和后序等都可以确定一课二叉树,
但前序和后序就不能确定一棵二叉树。

这里为什么这么设置前序的起止点,还有中序的起止点。

root->left = traversal(inorder, leftInorderBegin, leftInorderEnd,  preorder, leftPreorderBegin, leftPreorderEnd);

因为切割前序的右子树时,要用到中序的起止点
int rightPreorderBegin = preorderBegin + 1 + (delimiterIndex - inorderBegin);

代码:

	class Solution {
	private:
	        TreeNode* traversal (vector<int>& inorder, int inorderBegin, int inorderEnd, vector<int>& preorder, int preorderBegin, int preorderEnd) {
	        if (preorderBegin == preorderEnd) 
	        	return NULL;
	        int rootValue = preorder[preorderBegin]; 
	        // 注意用preorderBegin 不要用0
	        TreeNode* root = new TreeNode(rootValue);
	
	        if (preorderEnd - preorderBegin == 1) 
	        	return root;
	
	        int delimiterIndex;
	        for (delimiterIndex = inorderBegin; delimiterIndex < inorderEnd; delimiterIndex++) 
	        {
	            if (inorder[delimiterIndex] == rootValue) break;
	        	}
	        // 切割中序数组
	        // 中序左区间,左闭右开[leftInorderBegin, leftInorderEnd)
	        int leftInorderBegin = inorderBegin;
	        int leftInorderEnd = delimiterIndex;
	        // 中序右区间,左闭右开[rightInorderBegin, rightInorderEnd)
	        int rightInorderBegin = delimiterIndex + 1;
	        int rightInorderEnd = inorderEnd;
	        
	        // 切割前序数组
	        // 前序左区间,左闭右开[leftPreorderBegin, leftPreorderEnd)
	        int leftPreorderBegin =  preorderBegin + 1;
	        int leftPreorderEnd = preorderBegin + 1 + delimiterIndex - inorderBegin;
	        // 终止位置是起始位置加上中序左区间的大小size
	        // 前序右区间, 左闭右开[rightPreorderBegin, rightPreorderEnd)
	        int rightPreorderBegin = preorderBegin + 1 + (delimiterIndex - inorderBegin);
	        int rightPreorderEnd = preorderEnd; 
	
	        root->left = traversal(inorder, leftInorderBegin, leftInorderEnd,  preorder, leftPreorderBegin, leftPreorderEnd);
	        root->right = traversal(inorder, rightInorderBegin, rightInorderEnd, preorder, rightPreorderBegin, rightPreorderEnd);
	        return root;
	    }
	
	public:
	    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
	        if (inorder.size() == 0 || preorder.size() == 0) return NULL;
	
	        // 参数坚持左闭右开的原则
	        return traversal(inorder, 0, inorder.size(), preorder, 0, preorder.size());
	    }
	};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值