• LeetCode_Construct Binary Tree from Inorder and Postorder Traversal


    一.题目

    Construct Binary Tree from Inorder and Postorder Traversal

      Total Accepted: 33418 Total Submissions: 124726My Submissions

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

    Note:
    You may assume that duplicates do not exist in the tree.

    Show Tags
    Have you met this question in a real interview?  
    Yes
     
    No

    Discuss






    二.解题技巧

        这道题和Construct Binary Tree from Preorder and Inorder Traversal类似,都是考察基本概念的,后序遍历是先遍历左子树。然后遍历右子树,最后遍历根节点。

        做法都是先依据后序遍历的概念,找到后序遍历最后的一个值。即为根节点的值,然后依据根节点将中序遍历的结果分成左子树和右子树。然后就能够递归的实现了。
        上述做法的时间复杂度为O(n^2),空间复杂度为O(1)。
        


    三.实现代码

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    
    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    *     int val;
    *     TreeNode *left;
    *     TreeNode *right;
    *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */
    
    using std::vector;
    using std::find;
    
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    class Solution
    {
    private:
        TreeNode* buildTree(vector<int>::iterator PostBegin, vector<int>::iterator PostEnd,
                            vector<int>::iterator InBegin, vector<int>::iterator InEnd)
        {
            if (InBegin == InEnd)
            {
                return NULL;
            }
    
            if (PostBegin == PostEnd)
            {
                return NULL;
            }
    
            int HeadValue = *(--PostEnd);
            TreeNode *HeadNode = new TreeNode(HeadValue);
    
            vector<int>::iterator LeftEnd = find(InBegin, InEnd, HeadValue);
            if (LeftEnd != InEnd)
            {
                HeadNode->left = buildTree(PostBegin, PostBegin + (LeftEnd - InBegin),
                                 InBegin, LeftEnd);
            }
    
            HeadNode->right = buildTree(PostBegin + (LeftEnd - InBegin), PostEnd,
                                    LeftEnd + 1, InEnd);
    
            return HeadNode;
        }
    public:
        TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
        {
            if (inorder.empty())
            {
                return NULL;
            }
    
            return buildTree(postorder.begin(), postorder.end(), inorder.begin(),
                             inorder.end());
    
        }
    };




    四.体会

       这道题主要考察的是基本概念。并没有非常复杂的算法在里面,能够算是对于二叉树的遍历的进一步理解。




    版权全部,欢迎转载。转载请注明出处,谢谢微笑





  • 相关阅读:
    html5 localstorage本地存储
    如何在源码里修改openwrt root密码
    openwrt-scripts/config/mconf: Syntax error: “(” unexpected错误解决
    HTML5获取地理位置信息
    Mysql 查看连接数,状态 最大并发数(赞)
    晨读笔记:CSS3选择器之属性选择器
    CSS3选择器之属性选择器
    js判断浏览器类型
    javascript json字符串与对象相互转换
    手机端html5触屏事件(touch事件)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6984339.html
Copyright © 2020-2023  润新知