Construct Binary Tree from Inorder and Postorder Traversal

来源:互联网 发布:邻居树 推荐算法 编辑:程序博客网 时间:2024/06/07 07:02

题目大意:给定中序遍历和后序遍历的两组序列,根据这两组序列,还原出二叉树


解题思路:递归确定每个子树的根


/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {        if(inorder.size() != postorder.size()) {            return NULL;        }        int endIndex = postorder.size() - 1;        return buildTree(inorder, 0, inorder.size() - 1, postorder, endIndex);    }private:    TreeNode *buildTree(vector<int> &inorder, int istartIndex, int iendIndex, vector<int> &postorder, int &endIndex) {        if(endIndex < 0 || endIndex >= postorder.size()) {            return NULL;        }        if(istartIndex > iendIndex || iendIndex >= inorder.size() || istartIndex < 0) {            return NULL;        }        int index = istartIndex;        while(index <= iendIndex) {            if(postorder[endIndex] == inorder[index]) {                break;            }            index++;        }        if(index > iendIndex) {            return NULL;        }        TreeNode *tmp = new TreeNode(postorder[endIndex]);        if(index + 1 <= iendIndex) {            endIndex--;            tmp->right = buildTree(inorder, index + 1, iendIndex, postorder, endIndex);        }        if(istartIndex <= index - 1) {            endIndex--;            tmp->left = buildTree(inorder, istartIndex, index - 1, postorder, endIndex);        }        return tmp;    }};


0 0