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

Leetcode 105 Construct Binary Tree from Preorder and Inorder Traversal

作者头像
triplebee
发布2018-01-12 14:55:43
4090
发布2018-01-12 14:55:43
举报

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

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

根据先序和中序遍历还原二叉树。

思路很简单,先序中的第一个点必然为root,所以只要以先序的第一个元素在中序中的位置为分界线,左边为左子树,右边为右子树,递归下去就行

然而我遇到了问题,这是第一个版本,通过MLE了,我想应该是反复开辟了新的vector空间。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty()) return NULL;
        TreeNode* root=new TreeNode(preorder[0]);
        int pos;
        for(int i=0;i<inorder.size();i++)
        if(inorder[i]==preorder[0]) 
        {
            pos=i;
            break;
        }
        vector<int> leftpre,leftin,rightpre,rightin;
        for(int i=0;i<pos;i++)
        {
            leftpre.push_back(preorder[i+1]);
            leftin.push_back(inorder[i]);
        }
        for(int i=pos+1;i<preorder.size();i++)
        {
            rightpre.push_back(preorder[i]);
            rightin.push_back(inorder[i]);
        }
        root->left=buildTree(leftpre,leftin);
        root->right=buildTree(rightpre,rightin);
        return root;
    }
};

如果不开辟新的vector空间,只在原来的引用上做呢?毕竟引用不会像直接定义开辟另外的空间,可以顺利通过了,丑陋的WA了好多次。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* dfs(vector<int>& preorder, int ps,int pe,vector<int>& inorder,int is,int ie)
    {
        if(ps>pe ) return NULL;
        TreeNode* root=new TreeNode(preorder[ps]);
        int pos;
        for(int i=is;;i++)
        if(inorder[i]==preorder[ps])
        {
            pos=i-is;
            break;
        }
        root->left=dfs(preorder,ps+1,ps+pos,inorder,is,is+pos-1);
        root->right=dfs(preorder,ps+pos+1,pe,inorder,is+pos+1,ie);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return dfs(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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