牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端
总结:
重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
再
public class reConstructBinaryTree {
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null||in==null){ return null; }
TreeNode tree = reConstructCore(pre,in,0,pre.length-1,0,in.length-1);
return tree;
}
/**
*核心算法,preStart和preEnd是起始下标和结束下标
**/
public static TreeNode reConstructCore(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
TreeNode tree = new TreeNode(pre[preStart]);
tree.left = null;
tree.right= null;
if(preStart==preEnd&&inStart==inEnd){ return tree; }
//记录中序遍历中等于前序遍历的第一位的下标
int inCenter = 0;
for(inCenter = inStart;inCenter<inEnd;inCenter++){
if(in[inCenter]==pre[preStart]){
break;
}
}
//左子树的长度
int leftTreeLength = inCenter-inStart;
//右子数的长度
int rightTreeLength = inEnd-inCenter;
if(leftTreeLength>0){
tree.left = reConstructCore(pre,in,preStart+1,preStart+leftTreeLength,inStart,inCenter-1);
}
if(rightTreeLength>0){
tree.right = reConstructCore(pre,in,preStart+leftTreeLength+1,preEnd,inCenter+1,inEnd);
}
return tree; }
public static void traverseBinTreeRDL(TreeNode node){
if (node==null) { return; }
if (node.left!=null) {
traverseBinTreeRDL(node.left); }
if(node.right!=null) {
traverseBinTreeRDL(node.right); }
System.out.println(node.val);
}
public static void main(String[] arg0){
int pre[]= {1,2,4,7,3,5,6,8};
int in[] = {4,7,2,1,5,3,8,6};
TreeNode tree = reConstructBinaryTree(pre, in);
traverseBinTreeRDL(tree);
} }
输出:
7
4
2
5
8
6
3
1
牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端的更多相关文章
- 重建二叉树 牛客网 剑指Offer
重建二叉树 牛客网 剑指Offer 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3, ...
- 按之字形顺序打印二叉树 牛客网 剑指Offer
按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...
- 把二叉树打印成多行 牛客网 剑指Offer
把二叉树打印成多行 牛客网 剑指Offer 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行 # class TreeNode: # def __init__(self, x) ...
- 树的子结构 牛客网 剑指Offer
树的子结构 牛客网 剑指Offer 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) # class TreeNode: # def __init_ ...
- 数组中只出现过一次的数字 牛客网 剑指Offer
数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...
- 数组中出现次数超过一半的数字 牛客网 剑指Offer
数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
- 数字在排序数组中出现的次数 牛客网 剑指Offer
数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...
- 数值的整数次方 牛客网 剑指Offer
数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...
随机推荐
- hdu 2716 Message Decowding
Message Decowding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 射频识别技术漫谈(4)——数据编码【worldsing 笔记】
前已述及,射频识别技术中的调制方法一般使用调幅(AM),也就是将有用信号调制在载波的幅度上传送出去.这里的"有用信号"指用高低电平表示的数据"0"或" ...
- Emgu CV 高斯建模
Codeprivate void button1_Click(object sender, EventArgs e) { Emgu.CV.Capture cap = new Capture(" ...
- 关于Mysql Can't connect to mysql server on localhost(10061)的问题解决
这个问题很烦,试了网上很多朋友的方法,还是不行,大家都知道卸载mysql再想装就不那么容易了(虽然我卸载安装无数次都成功了),好了,不废话了, 如果出现这种问题,不要急,找到mysql的安装包 例如 ...
- Centos6 源代码部署MySQL5.6
mysql从5.5版本号開始,不再使用./configure编译,而是使用cmake编译器,详细的cmake编译參数能够參考mysql官网文档(※ 很重要) http://dev.mysql.com/ ...
- kettle參数、变量具体解说
kettle參数.变量具体解说 kettle 3.2 曾经的版本号里仅仅有 variable 和 argument,kettle 3.2 中.又引入了 parameter 概念.variable 即e ...
- 教你如何选择Android游戏引擎
我们进行Android游戏开发时选择游戏引擎是必须的,但是该如何选择呢?哪个Android游戏引擎更加适合自己呢?本文就提供了三个游戏引擎的对比说明,阐述了它们各自的特点,为大家选择引擎提供了参照. ...
- 【C/C++多线程编程之六】pthread相互排斥量
多线程编程之线程同步相互排斥量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. Pthread线程同步指多个线程协调地,有序地同步使用共享 ...
- linux之Apache
apache 在linux下命令 2. 编译Apache 在src目录下 ./configure 可用 ./configure--help|less 得到帮助, make, make install ...
- Mantis 安装与配置
1. 适用范围 a. 本文介绍基于 Windows 下的缺陷管理平台 Mantis. 2. 软件准备 a. 下载 EasyPHP:http://www.easyphp.org/easyphp-devs ...