【leetcode】106.Construct Binary Tree from Inorder and Postorder Traversal
Given two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the same tree, construct and return the binary tree.
由后序以及中序数组构建二叉树 后序二叉树的检索顺序是左右根 所以根节点从后往前依次查找,根据根节点位置将中序数组分割开,然后递归构建二叉树。
/**
* 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 {
private:
unordered_map<int,int>dp;
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
// 剑指offer 经典题目
int mid=postorder.size()-1; //根结点的位置 由于是后续遍历 根节点一定是从后往前找 即可
// hash set 存储每个节点在中序中的位置
for(int i=0;i<inorder.size();++i){
dp[inorder[i]]=i;
}
return make_tree(0,mid,mid,inorder,postorder);
}
TreeNode* make_tree(int left,int right,int &mid,vector<int>& inorder,vector<int> &postorder){
if(left>right) return nullptr;
int mid_num=postorder[mid];
int divide=dp[mid_num];
// 创建当前节点
TreeNode* root=new TreeNode(mid_num);
// 下一个根节点的位置
mid--;//这个变量必须传引用
//而且必须先构建右子树 再构建左子树 因为根节点是一级一级往前找到
root->right=make_tree(divide+1,right,mid,inorder,postorder);
root->left=make_tree(left,divide-1,mid,inorder,postorder);
return root;
}
};