【leetcode】105. Construct Binary Tree from Preorder and Inorder Traversal

题目:

Given preorder and inorder traversal of a tree, construct the binary tree.

翻译:

用一个二叉树的前序遍历和中序遍历还原二叉树。

思路:

这道题是一道比较基础的题。首先要弄清楚什么是前序遍历和中序遍历。前序遍历就是先遍历当前的节点,然后遍历该节点的左分支(即遍历左分支的所有节点),最后再遍历该节点的右分支。中序遍历是先遍历当前节点的左分支,再遍历当前节点,最后遍历当前节点的右分支。还有后序遍历,就是先右分支,再左分支,最后当前节点。比如下面这个二叉树的。前序遍历为ABDGHECKFIJ,中序遍历为GDHBEAKCIJF,后序遍历为GHDEBKJIFCA。具体的怎么由前序和中序(或者中序和后序)遍历还原出二叉树,可以参考这篇:http://bbs.51cto.com/thread-892707-1.html。虽说在纸上画出二叉树不难,但是代码实现其实还是有些难度的。


我们知道前序遍历的第一个数字一定是头节点,中序遍历输出某个数字的时候一定是该数字的左边分支已经遍历结束。因此我们可以设计一个栈,当前序遍历的第i位与当前中序遍历的第j位相同时,遍历该元素的右分支,并且栈顶元素出栈。具体可以结合代码理解。

代码:

<span style="font-size:18px;">class Solution {
public:
	TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
		if(preorder.size()==0)
			return NULL;
		TreeNode* root;
		stack<TreeNode*> st;
		TreeNode* tr;

		int i,j,k;
		k=i=j=0;

		root=new TreeNode(preorder[i]);
		st.push(root);
		tr=root;
		i++;

		while(i<preorder.size())
		{
			if (!st.empty() && st.top()->val==inorder[j])
			{
				tr=st.top();
				st.pop();
				k=1;
				j++;
			}
			else
			{
				if (k==0)
				{
					tr->left=new TreeNode(preorder[i]);
					i++;
					tr=tr->left;
					st.push(tr);
				}
				else
				{
					tr->right=new TreeNode(preorder[i]);
					i++;
					tr=tr->right;
					st.push(tr);
					k=0;
				}
			}
		}
		return root;
	}
};</span>
结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值