栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode-105. Construct Binary Tree from Preorder and Inorder Traversal [C++][Java]

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode-105. Construct Binary Tree from Preorder and Inorder Traversal [C++][Java]

LeetCode-105. Construct Binary Tree from Preorder and Inorder TraversalLevel up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

题目描述

Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree.

Example 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

Example 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

Constraints:

1 <= preorder.length <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorder and inorder consist of unique values.Each value of inorder also appears in preorder.preorder is guaranteed to be the preorder traversal of the tree.inorder is guaranteed to be the inorder traversal of the tree.

解题思路 【C++】
 
1. 递归 
class Solution {
public:
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        return R(preorder, 0, preorder.size(), inorder, 0, inorder.size());
    }
    
    TreeNode* R(vector& a, int aBegin, int aEnd, vector& b, int bBegin, int bEnd) {
        if (aBegin >= aEnd || bBegin >= bEnd) {return nullptr;}
        TreeNode* root = new TreeNode(a[aBegin]);
        int pivot = bBegin;
        while (pivot < bEnd && b[pivot] != a[aBegin]) {pivot++;}
        root->left = R(a, aBegin+1, aBegin+1+pivot-bBegin, b, bBegin, pivot);
        root->right = R(a, aBegin+1+pivot-bBegin, aEnd, b, pivot+1, bEnd);
        return root;
    }  
};
2. 循环
class Solution {
public:
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        if(preorder.size() == 0) return nullptr;
        unordered_map order;
        for(int i = 0;i < inorder.size();i++) order[inorder[i]] = i;
        TreeNode* out = new TreeNode(preorder[0]);
        stack stak;
        stak.push(out);
        for(int i = 1;i < preorder.size();i++) {
            int n = preorder[i];
            if(stak.empty()){
                out -> right = new TreeNode(n);
                stak.push(new TreeNode(n));
            } else {
                TreeNode* now = stak.top();
                if(order[now -> val] > order[n]) {
                    TreeNode* left = new TreeNode(n);
                    stak.push(left);
                    now -> left = left;
                } else {
                    while(!stak.empty() && order[stak.top() -> val] < order[n]) {
                        now = stak.top();
                        stak.pop();
                    }
                    TreeNode* right = new TreeNode(n);
                    now -> right = right;
                    stak.push(right);
                }
            }
        }
        return out;
    }
};

【Java】
 

递归

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return R(preorder, 0, preorder.length, inorder, 0, inorder.length);
    }

    private TreeNode R(int[] a, int aBegin, int aEnd, int[] b, int bBegin, int bEnd) {
        if (aBegin >= aEnd || bBegin >= bEnd) {return null;}
        TreeNode root = new TreeNode(a[aBegin]);
        int pivot = bBegin;
        for (; pivot 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739011.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号