前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode: Construct Binary Tree from Inorder and Postorder Traversal

Leetcode: Construct Binary Tree from Inorder and Postorder Traversal

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 15:29:01
4010
发布2019-01-22 15:29:01
举报

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

Note: You may assume that duplicates do not exist in the tree. 根据二叉树的中序遍历和后续遍历结果构造二叉树。

思路分析: 这道题和上道题《 Leetcode: Construct Binary Tree from Preorder and Inorder Traversal 》的思路类似。 二叉树后序遍历的最后一个节点是根节点。 在中序遍历中找出根节点,由根节点分开,中序遍历左边是左子树中序遍历结果(设有X个节点),右边是右子树遍历结果(设有Y个节点)。 后序遍历除去最后一个根节点,数X节点,这X个节点是左子树后序遍历的结果,剩下节点(肯定是Y个)是右子树后序遍历结果。 这样我们就得到了左右子树的后序遍历和中序遍历的结果了,所以又回到了原来的问题。

C++参考代码:

代码语言:javascript
复制
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    TreeNode *makeNode(vector<int>::iterator inBegin, vector<int>::iterator inEnd, vector<int>::iterator postBegin, vector<int>::iterator postEnd)
    {
        if (postBegin == postEnd) return nullptr;
        //从中序遍历结果中找出根节点(根节点在后序遍历中是最后一个节点)
        vector<int>::iterator itRoot = find(inBegin, inEnd, *(postEnd - 1));
        TreeNode *root = new TreeNode(*itRoot);
        //计算根的左子树节点个数
        int leftSize = itRoot - inBegin;
        //在中序遍历结果中根节点的左边是左子树中序遍历结果,右边是右子树中序遍历结果
        //在后序遍历结果中除去根节点前leftSize个节点是左子树前序遍历结果,后面的节点是右子树前序遍历结果
        root->left = makeNode(inBegin, itRoot, postBegin, postBegin + leftSize);
        root->right = makeNode(itRoot + 1, inEnd, postBegin + leftSize, postEnd - 1);
        return root;
    }

public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
    {
        if (postorder.empty()) return nullptr;
        TreeNode *root = makeNode(inorder.begin(), inorder.end(), postorder.begin(), postorder.end());
        return root;
    }
};

Java参考代码:

代码语言:javascript
复制
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private TreeNode makeNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) {
        if (postBegin == postEnd) return null;
        int index = 0;
        for (int i = inBegin; i < inEnd; i++) {
            if (inorder[i] == postorder[postEnd - 1]) {
                index = i;
            }
        }
        int leftSize = index - inBegin;
        TreeNode root = new TreeNode(postorder[postEnd - 1]);
        root.left = makeNode(inorder, inBegin, inBegin + leftSize, postorder, postBegin, postBegin + leftSize);
        root.right = makeNode(inorder, index + 1, inEnd, postorder, postBegin + leftSize, postEnd - 1);
        return root;
    }

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if (postorder.length == 0) return null;
        TreeNode root = makeNode(inorder, 0, inorder.length, postorder, 0, postorder.length);
        return root;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年04月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档