核心思想:
后序的最后一个数字是根,划分前序数组
划分同时,左右子数节点数也可以算出,则根的左右儿子可以确定。
最后dfs
/*
* @lc app=leetcode id=106 lang=cpp
*
* [106] Construct Binary Tree from Inorder and Postorder Traversal
*/
// @lc code=start
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int N = inorder.size();
TreeNode* Head = dfs(inorder,0,N,postorder,N-1);
return Head;
}
TreeNode* dfs(vector<int>& inorder,int L,int R,vector<int>& postorder,int loc){
for(int i=L;i<R;i++){
if(inorder[i] == postorder[loc]){
TreeNode* node = new TreeNode(postorder[loc]);
node->left = dfs(inorder,L,i,postorder,loc-(R-i));
node->right = dfs(inorder,i+1,R,postorder,loc-1);
return node;
}
}
return NULL;
}
};
// @lc code=end