LeetCode105. Construct Binary Tree from Preorder and Inorder Traversal

题目 

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

Tag

二分查找。dfs.递归。 


代码

0x0017F7D7 处有未经处理的异常(在 test.exe 中): 0xC00000FD: Stack overflow (参数: 0x00000001, 0x01242FBC)。

我的方法对于大数据的问题会栈溢出。

class Solution {
public:
	TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
		if (preorder.empty() || inorder.empty())
			return nullptr;
		//root    
		TreeNode* root = new TreeNode(preorder[0]);
		TreeNode* cur = root;
		preorder.erase(preorder.begin());

		auto it = inorder.begin();
		for (; it != inorder.end(); it++)
		{

			if (root->val == *it)
			{
				break;
			}

		}//在inorder中找到根节点的迭代器

		vector<int> leftin;
		vector<int> rightin;
		for (auto item = inorder.begin(); item<it; item++)
		{
			leftin.push_back(*item); 
		}
		
		inorder.erase(inorder.begin(),it+1); 
		rightin = inorder;

		root->left = buildTree(preorder, leftin);
		root->right = buildTree(preorder, rightin);
		return root;
	}
};

正确解法

 二分查找。递归。pre,in两个数组不变。参数 mid索引&,start起始距离,end终止距离。

注意数组越界判断。递归条件:mid>=pre.size || start>end

二分位置。pos= distance(.begin , find () )   。其中find内部(.begin+start,.begin+end,pre[mid])。

递归下一个mid :mid++。左:(mid,start ,pos -1) 右:(mid,pos+1,end)。

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int midindx=0;
        return helper(preorder,inorder,midindx,0,preorder.size()-1);//因为index是引用,所以要定义一个变量。不能直接传常量0进去,会报错
    }
    
private:
    TreeNode* helper(vector<int>& preorder,vector<int>& inorder,int& midIndex,int start,int end) {
        //递归终止"index不能等于size(越界)。start不能超过end,可以等于
        if(midIndex>=preorder.size()||start>end)
        return nullptr;
        
        TreeNode* root = new TreeNode(preorder[midIndex]);
        auto pos = distance(inorder.begin(),find(inorder.begin()+start,inorder.begin()+end,preorder[midIndex]));
        //find(.begin()+start,.begin()+end,pre[index]) 不能直接写.begin和.end,因为他们是会变的。
        midIndex++;
        
        root->left=helper(preorder,inorder,midIndex,start,pos-1);
        root->right=helper(preorder,inorder,midIndex,pos+1,end); 

        return root;
    }
};

 


问题

迭代

https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/discuss/34555/The-iterative-solution-is-easier-than-you-think!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值