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的空间来记录在中序遍历中的位置。

posted @ 2020-09-25 09:00  zmachine  阅读(123)  评论(0编辑  收藏  举报