106. Construct Binary Tree from Inorder and Postorder Traversal

来源:互联网 发布:淘宝加盟诈骗案进展 编辑:程序博客网 时间:2024/06/05 09:29

Given inorder and postorder traversal of a tree, construct the binary tree.

注意左子树在后序中的根的位置为:root - (end - pos + 1), 根的位置-右子树的个数

/** * 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 {public:    TreeNode* dfs(int root, int start, int end, vector<int>& inorder, vector<int>& postorder, TreeNode* node)    {        if(start == end){            if(root < 0 || root >= inorder.size())                return NULL;            else {                node = new TreeNode(inorder[start]);                if(node == NULL) return NULL;            }        } else if(start > end)            return NULL;        else {            int pos = start;            while(pos < end && inorder[pos] != postorder[root]) ++pos;            if(node == NULL){                node = new TreeNode(inorder[pos]);                if(node == NULL) return NULL;            }            node->left = dfs(root - (end - pos + 1), start, pos - 1, inorder, postorder, node->left);            node->right = dfs(root - 1, pos + 1, end, inorder, postorder, node->right);        }        return node;    }    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {        TreeNode* bst = NULL;        int sz = inorder.size();        if(sz == NULL) return bst;        bst = dfs(sz - 1, 0, sz - 1, inorder, postorder, bst);        return bst;    }};

二刷:
和前序一样的思路,后序中左子树的范围:[postl, postl + pos - l - 1]。同理pos - l - 1是中序得到左子树的个数

/** * 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 {public:    TreeNode* dfs(vector<int>& inorder, vector<int>& postorder, int postl, int postr, int l, int r){        int pos;        TreeNode* tree;        if(l > r) return NULL;        for(int i = 0; i <= r; ++i){            if(postorder[postr] == inorder[i]){                tree = new TreeNode(inorder[i]);                pos = i;                break;            }        }        tree->left = dfs(inorder, postorder, postl, postl + (pos - l - 1), l, pos - 1);        tree->right = dfs(inorder, postorder, postl + pos - l, postr - 1, pos + 1, r);        return tree;    }    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {        if(inorder.empty()) return NULL;        return dfs(inorder, postorder, 0, postorder.size() - 1, 0, inorder.size() - 1);    }};
0 0