当前位置: 首页 > 编程日记 > 正文

leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)...

题目:

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

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

说明:

1)二叉树可空

2)思路:a、根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中序序列(InSequence)中查找此根(root), 

                   b、根据中序遍历特点, 知在查找到的根(root) 前边的序列为根的左子树的中序遍历序列,  后边的序列为根的右子树的中序遍历序列。

                   c、设在中序遍历序列(InSequence)根前边有left个元素. 则在前序序列(PreSequence)中, 紧跟着根(root)的left个元素序列(即PreSequence[1...left]) 为根的            左子树的前序遍历序列, 在后边的为根的右子树的前序遍历序列.而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为PreSequence[1...left]), 中序序列            为InSequence[0...left-1], 分别为原序列的子串, 构造右子树同样, 显然可以用递归方法解决。

实现:

实现一:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
13        TreeNode *root=NULL;
14        creatTree(&root,preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
15        return root;
16     }
17 private:
18      //双指针(TreeNode **t)实现构建二叉树
19     void creatTree(TreeNode **t,vector<int>::iterator pre_beg,vector<int>::iterator pre_end,vector<int>::iterator in_beg,vector<int>::iterator in_end)
20     {
21       if(pre_beg==pre_end) //空树
22       {
23          (*t)=NULL;
24          return;         
25       }
26       (*t)=new TreeNode(*pre_beg);
27       vector<int>::iterator inRootPos=find(in_beg,in_end,(*t)->val);//中序遍历中找到根节点,返回迭代指针
28        int leftlen=distance(in_beg,inRootPos);//中序遍历起点指针与找到的根节点指针的距离
29       creatTree(&((*t)->left),next(pre_beg),next(pre_beg,leftlen+1),in_beg,inRootPos);//递归构建左子数
30       creatTree(&((*t)->right),next(pre_beg,leftlen+1),pre_end,next(inRootPos),in_end);//递归构建右子树
31     }
32 };

实现二:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
13        TreeNode *root=NULL;
14        creatTree(root,preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
15        return root;
16     }
17 private:
18      //指针引用(TreeNode *&t)实现构建二叉树
19     void creatTree(TreeNode *&t,vector<int>::iterator pre_beg,vector<int>::iterator pre_end,vector<int>::iterator in_beg,vector<int>::iterator in_end)
20     {
21       if(pre_beg==pre_end) //空树
22       {
23          t=NULL;
24          return;         
25       }
26       t=new TreeNode(*pre_beg);
27       vector<int>::iterator result=find(in_beg,in_end,t->val);//中序遍历中找到根节点,返回迭代指针
28        int len=distance(in_beg,result);//中序遍历起点指针与找到的根节点指针的距离
29       creatTree(t->left,pre_beg+1,pre_beg+len+1,in_beg,result);//递归构建左子数
30       creatTree(t->right,pre_beg+len+1,pre_end,result+1,in_end);//递归构建右子树
31     }
32 };

转载于:https://www.cnblogs.com/zhoutaotao/p/3833270.html

相关文章:

swift string,Int,Double相互转换

import UIKitvar str "Hello, playground" // 1 字符串转Int Double Float var str1 "818"; // 转Int var val1 Int(str1); // 转Double var val2 Double(str1); // 转float var val3 Float(str1);// 如果是25.0 转 Int&#xff0c;则需要先转为Doubl…

classlist使用方法_如何通过使用HTML5的classList API在没有jQuery的情况下操作类

classlist使用方法by Ayo Isaiah通过Ayo Isaiah 如何通过使用HTML5的classList API在没有jQuery的情况下操作类 (How to manipulate classes without jQuery by using HTML5s classList API) As a front end developer, you often need to change CSS rules based on how a us…

键盘码 ascii码

ASCII码表 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 96 、 1 SOH 33 &#xff01; 65 A 97 a 2 STX 34 ” 66 B 98 b 3 ETX 35 # 67 C 99 c 4 EOT 36 $ 68 D 100 d 5 ENQ 37 % 69 E 101 e 6 ACK 38 & 70 F 102 f 7 BEL …

Swift -布局框架SnapKit使用

SnapKit 1 安装 SnapKit github地址 2 文档地址 在线文档 // // ViewController.swift // SK_SnapKit // // Created by coder on 2019/3/6. // Copyright © 2019 AlexanderYeah. All rights reserved. //import UIKit import SnapKitclass ViewController: UIVie…

Hadoop概念学习系列之为什么hadoop/spark执行作业时,输出路径必须要不存在?(三十九)...

很多人只会&#xff0c;但没深入体会和想为什么要这样&#xff1f; 拿Hadoop来说&#xff0c;当然&#xff0c;spark也一样的道理。 输出路径由Hadoop自己创建&#xff0c;实际的结果文件遵守part-nnnn的约定。 如何指定一个已有目录作为Hadoop作业的输出路径&#xff0c;作业将…

已知环境静态障碍物避障_我女儿如何教我无障碍环境

已知环境静态障碍物避障by Drew通过德鲁 我女儿如何教我无障碍环境 (How my daughter taught me about accessibility) 在过去的几个月里&#xff0c;花了很多时间学习编程知识&#xff0c;这真是令人大开眼界。 面对似乎无穷无尽的技术和概念(即使是最简单的事物)&#xff0c…

IIS 部署 node.js ---- 基础安装部署

一些可能有用的相关文章&#xff1a; https://blogs.msdn.microsoft.com/scott_hanselman/2011/11/28/window-iisnode-js/ http://blog.csdn.net/puncha/article/details/9047311 20161123&#xff0c;这几天看了一些相关文章&#xff0c;觉得说的不太清楚&#xff0c;记录一下…

Qt中的 Size Hints 和 Size Policies

sizeHint 这个属性所保存的 QSize 类型的值是一个被推荐给窗口或其它组件&#xff08;为了方便下面统称为widget&#xff09;的尺寸&#xff0c;也就是说一个 widget 该有多大&#xff0c;它的一个参考来源就是这个 sizeHint 属性的值&#xff0c;而这个值由 sizeHint() 函数来…

atom 中首次使用git_使用Atom获得更好的Git提交消息

atom 中首次使用gitby Hasit Mistry通过Hasit Mistry 使用Atom获得更好的Git提交消息 (Get Better Git Commit Messages with Atom) Recently, I came across two enlightening posts about writing better Git commit messages. These posts give suggestions about how a we…

正确理解ThreadLocal

详见&#xff1a;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt107 首先&#xff0c;ThreadLocal 不是用来解决共享对象的多线程访问问题的&#xff0c;一般情况下&#xff0c;通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象&#xff0c;其他线程…

PHP-密码学算法及其应用-对称密码算法

转自&#xff1a;http://www.smatrix.org/bbs/simple/index.php?t5662.html //目录1. PHP的散列函数及其应用2. PHP中的对称密码算法及其应用3. PHP的公钥密码算法及其应用///2 PHP中的对称密码算法及其应用前一段时间一直想写完PHP中的密码学算法及其应用的三大部分…

Swift4 String截取字符串

var str1 "AlexanderYeah";// 1 截取字符串的第一种方式 // prefix 截取前3个字符串 var str2 str1.prefix(3); print(str2);// suffix 截取后3个字符串 var str3 str1.suffix(3); print(str3);// 2 截取一个范围的字符串 // 从0开始 到倒数第二位结束 let idx1 …

angular react_Angular 2 vs React:将会有鲜血

angular reactAngular 2 has reached Beta and appears poised to become the hot new framework of 2016. It’s time for a showdown. Let’s see how it stacks up against 2015’s darling: React.Angular 2已达到Beta版本&#xff0c;并有望成为2016年炙手可热的新框架。该…

Welcome to Swift (苹果官方Swift文档初译与注解三十四)---241~247页(第五章-- 函数)

In-Out Parameters (全局参数) 像前面描述的参数变量,只能在函数体内进行修改,如果你需要函数修改的它的参数值,并且希望这些改变在函数调用结束后仍然有效,可以定义使用全局参数. 定义全局参数使用关键字inout,全局参数的值在函数调用的时候进行传递,在函数体内进行修改,最后函…

递归 尾递归_代码简报:递归,递归,递归

递归 尾递归Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事&#xff1a; A beginner’s guide to recursion: 6 minute read 递归初学者指南&#xff1a; 6分钟阅读 Things you probably didn’t know you …

Hadoop 生态系统

当下 Hadoop 已经成长为一个庞大的生态体系&#xff0c;只要和海量数据相关的领域&#xff0c;都有 Hadoop 的身影。下图是一个 Hadoop 生态系统的图谱&#xff0c;详细列举了在 Hadoop 这个生态系统中出现的各种数据工具。这一切&#xff0c;都起源自 Web 数据爆炸时代的来临。…

socket通信——通过Udp传输方式,将一段文字数据发送出去

需求&#xff1a;通过Udp传输方式&#xff0c;将一段文字数据发送出去定义一个Udp发送端思路&#xff1a;1、建立updsocket服务2、提供数据&#xff0c;并将数据封装到数据包中。3、通过socket服务的发送功能&#xff0c;将数据包发出去4、关闭资源。import java.net.*; class …

编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器

编码中统一更该变量的快捷键by freeCodeCamp通过freeCodeCamp 流媒体的7种方式使您成为更好的编码器 (7 Ways Streaming Makes you a Better Coder) After coding live on twitch.tv for dozens of hours, I’m convinced that streaming makes you a better coder. Here’s w…

AutoConfig工具使用

下载安装Auto工具包&#xff1a; http://code.taobao.org/mvn/repository/com/alibaba/citrus/tool/antx-autoconfig/1.0.9/antx-autoconfig-1.0.9.tgzhttp://code.taobao.org/mvn/repository/com/alibaba/citrus/tool/antx-autoexpand/1.0.9/antx-autoexpand-1.0.9.tgztar zxv…

Spark2 ML 学习札记

摘要&#xff1a;  1.pipeline 模式 1.1相关概念 1.2代码示例  2.特征提取&#xff0c;转换以及特征选择 2.1特征提取 2.2特征转换 2.3特征选择 3.模型选择与参数选择 3.1 交叉验证 3.2 训练集-测试集 切分 4.spark新增SparkSession与DataSet 内容&#xff1a; 1.pipeline …

xCode 开发快捷键

Ctrl CMD 右箭头返回上一个编辑的界面Ctrl CMD 左箭头返回后一个编辑的界面CMD Option 左箭头区域代码折叠CMD Option 右箭头区域代码展开Shift CMD Option 左箭头折叠界面内所有的代码Shift CMD Option 右箭头展开界面内所有的代码CMD Ctrl 上下箭头.h 和 .m …

javascript模块_JavaScript模块第2部分:模块捆绑

javascript模块by Preethi Kasireddy通过Preethi Kasireddy JavaScript模块第2部分&#xff1a;模块捆绑 (JavaScript Modules Part 2: Module Bundling) In Part I of this post, I talked about what modules are, why developers use them, and the various ways to incorp…

idea上实现github代码同步

1.先将github远程仓库clone到本地 2.将本地仓库中的项目导入到idea中 3.如果你的项目代码不是放在仓库的根目录下&#xff0c;idea会识别到你的项目是在git仓库目录下&#xff0c;必须点击add root才能匹配路径。 4.add root后会发现右击项目时会多了一个git选项 5.在git选项中…

iOS12 UITabbar Item 向上漂移错位的bug

[[UITabBar appearance] setTranslucent:NO]; 加此行代码 完美解决此bug

jQuery学习笔记(一)

补充一些自己容易忘的知识点: event.stopPropagation() 阻止事件冒泡 event.preventDefault() 阻止事件的默认行为 return false 相当于event.stopPropagation() event.preventDefault() 。除了阻止默认行为之外&#xff0c;还会阻止事件冒泡。 转载于:https://www.cnblogs.…

随机网络构建_构建随机报价机

随机网络构建by Ayo Isaiah通过Ayo Isaiah 构建随机报价机 (Building a Random Quote Machine) I really wasn’t entirely satisfied with my first attempt at building a Random Quote Generator on Free Code Camp. It was ugly, and the quotes were too long, so I didn…

20145231 《信息安全系统设计基础》第11周学习总结

20145231《信息安全系统设计基础》第11周学习总结 教材学习内容总结 异常 异常是异常控制流的一种形式&#xff0c;由硬件和操作系统实现。简单来说&#xff0c;就是控制流中的突变。 出现异常的处理方式&#xff1a; 1.处理器检测到有异常发生 2.通过异常表&#xff0c;进行间…

JAR命令使用

jar 命令详解 jar 是随 JDK 安装的&#xff0c;在 JDK 安装目录下的 bin 目录中&#xff0c;Windows 下文件名为 jar.exe&#xff0c;Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做&#xff0c;因…

捍卫者usb管理控制系统_捍卫超模块化JavaScript

捍卫者usb管理控制系统by Mike Groseclose通过Mike Groseclose 捍卫超模块化JavaScript (In Defense of Hyper Modular JavaScript) Last week npmgate was a big topic for the JavaScript community. For those of you who haven’t been following what happened, here’s …

Android开发——布局性能优化的一些技巧(一)

0. 前言上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高&#xff0c;意义在于分析了这两种布局的实现源码&#xff0c;算是对一个小结论的证明过程&#xff0c;但是对布局性能的优化效果&#xff0c;对这两种布局的选择远不如减少布局层级、避免过分绘制、按需加…