首先要知道一个结论,前序/后序+中序序列可以唯一确定一棵二叉树,所以自然而然可以用来建树。
看一下中序和后序有什么特点,中序[9,3,15,20,7] ,后序[9,15,7,20,3];
有如下特征:
代码如下
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return pre_order(0, inorder.size() - 1, 0, inorder.size() - 1, inorder, postorder);
}
TreeNode *pre_order(int leftin, int rightin, int leftpost, int rightpost, vector<int> &in, vector<int> &post) {
if (leftin > rightin) return NULL;
TreeNode *root = new TreeNode(post[rightpost]);
int rootin = leftin;
while (rootin <= rightin && in[rootin] != post[rightpost]) rootin++;
int left = rootin - leftin;
root->left = pre_order(leftin, rootin - 1, leftpost, leftpost + left - 1, in, post);
root->right = pre_order(rootin + 1, rightin, leftpost + left, rightpost - 1, in, post);
return root;
}
};