Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
/** * 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 {//1.需要注意到后序遍历的最后一个节点始终是当前树的根节点 //2.由于后续遍历的顺序是先构造左子树,再构造右子树,所以后面存的是右子树的根,所以在还原的树的时候注意先还原右子树 int post_idx; unordered_map<int,int> idx_map; public: TreeNode* helper(int in_left,int in_right,vector<int>& inorder,vector<int>& postorder) { if(in_left > in_right){ return NULL; } int root_val = postorder[post_idx];//选取后序遍历的post_id位置作为当前子树的根节点 TreeNode* root = new TreeNode(root_val); //根据root的所在的位置分成左右子树 int index = idx_map[root_val]; //下标减一 post_idx--; //构造右子树 root->right = helper(index + 1,in_right,inorder,postorder); //构造左子树 root->left = helper(in_left,index-1,inorder,postorder); return root; } TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//传入中序遍历和后续遍历的两个Vector //从后续遍历的最后一个元素开始 post_idx = (int)postorder.size() - 1; //建立(元素,下标)键值对的哈希表 int idx = 0; for(auto& val:inorder){ idx_map[vacl] = idx++; }//对中序遍历进行处理,建立了相应的hasp_map; return helper(0,(int)inorder.size() -1,inorder,postorder); } };
注意:
1.恢复的顺序必须是先是右子树,然后是左子树
2.由于后续遍历中只能找到某一元素的值,而无法直接通过元素的值找到该元素在中序遍历中的位置,因此需要一个额外的unordered_map的空间来记录在中序遍历中的位置。