题目1-二叉树重建

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路

  • 前序遍历:跟节点 + 左子树前序遍历 + 右子树前序遍历
  • 中序遍历:左子树中序遍历 + 跟节点 + 右字数中序遍历
  • 后序遍历:左子树后序遍历 + 右子树后序遍历 + 跟节点

根据上面的规律:

  • 前序遍历找到根结点root
  • 找到root在中序遍历的位置 -> 左子树的长度和右子树的长度
  • 截取左子树的中序遍历、右子树的中序遍历
  • 截取左子树的前序遍历、右子树的前序遍历
  • 递归重建二叉树

代码

function reConstructBinaryTree(pre, vin) {
if(pre.length === 0){
return null;
}
if(pre.length === 1){
return new TreeNode(pre[0]);
}
const value = pre[0];
const index = vin.indexOf(value);
const vinLeft = vin.slice(0,index);
const vinRight = vin.slice(index+1);
const preLeft = pre.slice(1,index+1);
const preRight = pre.slice(index+1);
const node = new TreeNode(value);
node.left = reConstructBinaryTree(preLeft, vinLeft);
node.right = reConstructBinaryTree(preRight, vinRight);
return node;
}


题目2-求二叉树的遍历

给定一棵二叉树的前序遍历和中序遍历,求其后序遍历

输入描述:

两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。 二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。

输出描述:

输入样例可能有多组,对于每组测试样例, 输出一行,为后序遍历的字符串。

样例:

输入
ABC
BAC
FDXEAG
XDEFAG 输出
BCA
XEDGAF

思路

和上面题目的思路基本相同

  • 前序遍历找到根结点root
  • 找到root在中序遍历的位置 -> 左子树的长度和右子树的长度
  • 截取左子树的中序遍历、右子树的中序遍历
  • 截取左子树的前序遍历、右子树的前序遍历
  • 递归拼接二叉树的后序遍历

代码

let pre;
let vin; while((pre = readline())!=null){
vin = readline();
print(getHRD(pre,vin));
} function getHRD(pre, vin) {
if (!pre) {
return '';
}
if (pre.length === 1) {
return pre;
}
const head = pre[0];
const splitIndex = vin.indexOf(head);
const vinLeft = vin.substring(0, splitIndex);
const vinRight = vin.substring(splitIndex + 1);
const preLeft = pre.substring(1, splitIndex + 1);
const preRight = pre.substring(splitIndex + 1);
return getHRD(preLeft, vinLeft) + getHRD(preRight, vinRight) + head;
}
 

4、重建二叉树------------>剑指offer系列的更多相关文章

  1. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  2. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------>剑指offer系列

    题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...

  3. 剑指Offer系列之题1~题5

    目录 1.二维数组的查找 2.替换空格 3.从尾到头打印链表 4.链表中环的入口节点 5.重建二叉树 写在前面:本随笔中包含五道题:题目描述,题目思路以及对应解法. 1.二维数组的查找 在一个二维数组 ...

  4. 剑指offer系列(六)

    题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList,例如按照链表顺序,1->2->3->4->5->6->7->8,那么我们将得到{8 ...

  5. 剑指offer系列34----按之字形顺序打印二叉树

    [题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...

  6. 剑指offer系列33-----把二叉树打印成多行

    [题目]从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 方法一:直接打印 package com.exe7.offer; import java.util.LinkedList; i ...

  7. 剑指offer系列32-----对称二叉树的判断

    [题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. package com.exe7.offer; /** * [题目]请实现一个函 ...

  8. 剑指offer系列20--从上到下打印二叉树

    * 20 [题目]从上往下打印出二叉树的每个节点,同层节点从左至右打印. * [思路]从根结点开始,先保存结点,再看根结点的左右结点有没有值. * 有,就将左右值放到集合中: * 根节点输出后,打印根 ...

  9. 剑指offer系列——59/60.按之字形顺序打印二叉树/把二叉树打印成多行

    Q:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. A:BFS,偶数层reverse vector&l ...

随机推荐

  1. 「网络流24题」「LuoguP3358」 最长k可重区间集问题(费用流

    题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...

  2. bootStrap效果图

    http://www.ziqiangxuetang.com/bootstrap/bootstrap-tutorial.html

  3. SPOJ(后缀数组求不同子串个数)

    DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct subs ...

  4. ADB命令小结

    )adb devices //查看启动的所有设备 )adb kill-server //重启设备 )adb start-server //启动设备 )adb -s emulator-(通过 adb d ...

  5. Manasa and Combinatorics

    题意: 给定n,求问由2n个字母B,n个字母A构成的字符串中 任意前缀B的个数大于A的个数且任意后缀B的个数大于A的个数的 字符串个数. 解法: 注意到答案不易于直接计算,所以我们考虑应用容斥原理. ...

  6. Asset Catalog Help (八)---Customizing Image Sets for Devices

    Customizing Image Sets for Devices Add images to a set that are customized for display on the device ...

  7. 4-1逻辑与运算符介绍 & 4-2逻辑或运算符介绍

    后面括号内的(n++)不运算了. 4-2逻辑或运算符介绍

  8. sed的基础用法简介

    sed 最近学习了一些sed的相关知识,初步接触sed以后给我的感受主要有两点.首先是sed强大的功能,学了以后发现之前写的脚本利用sed以后会简化很多啊,具体的有些利用sed编辑shell脚本的思路 ...

  9. CCF 201604-2 俄罗斯方块 (模拟)

    问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新的由4个小方 ...

  10. mysql 自动备份命令

    --1.全备 --single-transaction:基于此选项能实现热备InnoDB表  --databases要备份的表名mysqldump -u root -p --single-transa ...