• LeetCode_Construct Binary Tree from Preorder and Inorder Traversal


    一.题目

    Construct Binary Tree from Preorder and Inorder Traversal

      Total Accepted: 36475 Total Submissions: 138308My Submissions

    Given preorder and inorder 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







    二.解题技巧

         这道题仅仅是考察先序和中序遍历的概念,先序是先訪问根节点,然后訪问左子树。最后訪问右子树;中序遍历是先遍历左子树,然后訪问根节点。最后訪问右子树。

        做法都是先依据先序遍历的概念,找到先序遍历的第一个值,即为根节点的值。然后依据根节点将中序遍历的结果分成左子树和右子树。然后就能够递归的实现了。

        上述做法的时间复杂度为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 PreBegin, vector<int>::iterator PreEnd,
                            vector<int>::iterator InBegin, vector<int>::iterator InEnd)
        {
            if (PreBegin == PreEnd)
            {
                return NULL;
            }
    
            int HeadValue = *PreBegin;
            TreeNode *HeadNode = new TreeNode(HeadValue);
    
            vector<int>::iterator LeftEnd = find(InBegin, InEnd, HeadValue);
            if (LeftEnd != InEnd)
            {
                HeadNode->left = buildTree(PreBegin + 1, PreBegin + (LeftEnd - InBegin) + 1,
                                 InBegin, LeftEnd);
            }
    
            HeadNode->right = buildTree(PreBegin + (LeftEnd - InBegin) + 1, PreEnd,
                                    LeftEnd + 1, InEnd);
    
            return HeadNode;
        }
    public:
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
        {
            if (preorder.empty())
            {
                return NULL;
            }
    
            return buildTree(preorder.begin(), preorder.end(), inorder.begin(),
                             inorder.end());
    
        }
    };




    四.体会

        这道题是考察基础概念的题。并不须要非常多算法,仅仅是一个递归的过程。



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






  • 相关阅读:
    面试题:链表倒数第k个节点
    面试题:重建二叉树
    面试题:从尾到头打印链表
    面试题:第一个出现的字符位置
    面试题:调整数组顺序
    面试题:有限制条件的求和
    面试题:Fibonacci数列
    面试题:旋转数组的最小数字
    面试题:替换空格
    EndNote8破解版下载安装
  • 原文地址:https://www.cnblogs.com/llguanli/p/7123269.html
Copyright © 2020-2023  润新知