LeetCode 105:Construct Binary Tree from Preorder and Inorder Traversal

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

给定一个二叉树的前序和中序遍历,重建这棵二叉树。


所谓前序遍历,即先访问根节点,在依次访问左、右子树。这样根节点在二叉树前序遍历的第一个元素。元素排列为: 根、左子树、右子树

所谓中序遍历,即使先访问左子树,然后访问根节点,,再访问又子树,这样根节点位于中序遍历中间位置,左边为左子树的节点,右边为右子树的节点。元素排列为: 左子树、根、右子树。

所以通过前序后中序遍历,重建二叉树的过程如下:

1、取前序遍历的第一个节点作为根。

2、从中序遍历中查找根元素,元素左边的为左子树节点的中序遍历,右边为右子树节点的中序遍历。

3、根据左子树节点个数从前序遍历中分离出左子树的前序遍历和右子树的前序遍历。

4、根据2、3分分解得到的左子树的前序、中序遍历递归构建左子树。根据右子树的前序、中序遍历递归构建右子树。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
TreeNode * helper(vector<int>& preorder, vector<int>::iterator begin1, vector<int>::iterator end1,
		vector<int>& inorder, vector<int>::iterator begin2, vector<int>::iterator end2){
		if (begin1>=end1 || begin2>=end2)
			return 0;
		//取前序遍历的第一个节点构建根节点
		int value = *begin1;
		TreeNode *pNode = new TreeNode(value);
		
		//在中序遍历中,根左边的为左子树节点的中序遍历,右边为右子树节点的中序遍历
		vector<int>::iterator it = find(begin2, end2, value);
		int leftLength = it - begin2;
		
		//在前序遍历中,除第一个元素,及根外,前leftLength个节点为左子树的前序遍历,然后是右子树的前序遍历
		
		//通过左子树的前序、中序遍历递归构建左子树
		pNode->left = helper(preorder, begin1+1, begin1+leftLength+1,
							 inorder, begin2, it);
		//通过右子树的前序、中序遍历递归构建右子树					 
		pNode->right = helper(preorder, begin1+leftLength+1, end1,
							  inorder, it+1, end2);
		return pNode;
	}
	
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return helper(preorder, preorder.begin(), preorder.end(), inorder, inorder.begin(), inorder.end());
    }
};



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值