LintCode(炼码) / LeetCode 参考答案免费查询
描述中文
根据中序遍历和后序遍历树构造二叉树
你可以假设树中不存在相同数值的节点
在线评测地址
LintCode 炼码样例
样例 1:
输入:
中序遍历 = []
后序遍历 = []
输出:
{}
解释:
二叉树为空
样例 2:
输入:
中序遍历 = [1,2,3]
后序遍历 = [1,3,2]
输出:
{2,1,3}
解释:
二叉树如下
2
/ \
1 3
题解答案
根据当前后续序列的最后一个结点,在对应的中序遍历中找到位置,然后相同的方法,递归左右子树即可。
#include <vector>
#include "lintcode.h"
#include <algorithm>
using namespace std;
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
*@param inorder : A list of integers that inorder traversal of a tree
*@param postorder : A list of integers that postorder traversal of a tree
*@return : Root of a tree
*/
public:
typedef vector<int>::iterator Iter;
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
// write your code here
if (inorder.size() == 0)
return NULL;
return buildTreeRecur(inorder.begin(), inorder.end(), postorder.begin(),
postorder.end());
}
TreeNode *buildTreeRecur(Iter istart, Iter iend, Iter pstart, Iter pend)
{
if(istart == iend)return NULL;
int rootval = *(pend-1);
Iter iterroot = find(istart, iend, rootval);
TreeNode *res = new TreeNode(rootval);
res->left = buildTreeRecur(istart, iterroot, pstart, pstart+(iterroot-istart));
res->right = buildTreeRecur(iterroot+1, iend, pstart+(iterroot-istart), pend-1);
return res;
}
};
更多题解参考:
九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧