Loading

【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;
    }
};
posted @ 2021-11-21 17:40  aalanwyr  阅读(32)  评论(0编辑  收藏  举报