欢迎访问我的剑指offer(第二版)题解目录哦
对应的leetcode题目可点击leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal。
题目描述
Given inorder and postorder traversal of a tree, construct the binary tree.
算法设计
后根遍历是按照“左右中”顺序,中根遍历是按照“左中右”顺序。可以根据后根序列确定根结点,根据中根序列确定左子树和右子树,递归处理左右子树即可。
C++代码
/**
* 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* f(vector<int>& post, vector<int>& in, int left, int right, int root) {
if (left > right)
return nullptr;
int i = find(in.begin() + left, in.begin() + right + 1, post[root]) - in.begin();
TreeNode* r = new TreeNode(post[root]);
r->left = f(post, in, left, i - 1, root - 1 - right + i);
r->right = f(post, in, i + 1, right, root - 1);
return r;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return f(postorder, inorder, 0, inorder.size() - 1, postorder.size() - 1);
}
};