【JavaScript】前端算法题(重建二叉树、反向输出链表每个节点)
前言
今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点
题目
重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
前序遍历(根左右)和中序遍历(左根右)
思路就是使用递归把他分化为每个小的二叉树,然后都根据前序遍历(根左右)和中序遍历(左根右)的特性,前序的首元素就是根,然后再找到中序的根,根的左边就是左右边就是右,再进行递归,直到前序为null的时候就代表没有根节点了,那这个元素就是尾节点
一.
①[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]-> val=>1 ->L([2,4,7],[4,7,2]) & R([3,5,6,8],[5,3,8,6]) 根节点 1 ,有左右节点
二.
①L([2,4,7],[4,7,2])-> val=>2 ->L([4,7],[4,7]) && R(null , null) 根节点2(属1的左节点) ,有左节点,无右节点
②R([3,5,6,8],[5,3,8,6])-> val=>3 ->L([5],[5]) && R([6,8],[6,8]) 根节点3(属1的右节点) ,有左右节点
三.
①L([4,7],[4,7]) ->val=>4 -> L(null , null) && R([7],[7]) 根节点4(属2的左节点) ,有右节点,无左节点
②R([6,8],[8,6]) -> val=>6 -> L([8] , [8]) && R(null , null) 根节点6(属3的右节点),有左节点,无右节点
③L([5],[5]) -> val=>5->(null,null)->终止 尾节点5(属3的左节点)
四.
①R([7],[7]) -> val=>7 ->终止 尾节点7(属4的右节点)
②L([8],[8]) -> val=>8 ->终止 尾节点8(属6的左节点)
代码实现
function rebuildBinaryTree(front, centre) {
//判断是否为空节点
if (!front || front.length == 0) {
return null;
}
// 根节点
var TreeNode = {
val: front[0]
};
for (var i = 0; i < front.length; i++) {
//找到中序遍历根节点位置
if (centre[i] === front[0]) {
//中序遍历(左根右)
//根节点左边的节点为该节点的左边
TreeNode.left = rebuildBinaryTree(front.slice(1, i + 1), centre.slice(0, i));
//根节点右边的节点为该节点的右边
TreeNode.right = rebuildBinaryTree(front.slice(i + 1), centre.slice(i + 1));
}
}
return TreeNode;
}
let tree = rebuildBinaryTree([1, 2, 4, 7, 3, 5, 6, 8], [4, 7, 2, 1, 5, 3, 8, 6])
console.log(tree)
题目
从尾到头打印链表: 输入一个链表,从尾到头打印链表每个节点的值。
思路
由于链表是单向的,我们不能直接从头节点开始反向遍历。
所以可以使用数组来模拟栈。迭代遍历链表,将链表每个节点压入栈中,然后再依次从栈中弹出并打印。
代码实现
// 定义一个节点类,结构data表示节点数据、next表示下个节点的指针
class Node {
constructor(data) {
this.data = data
this.next = null
}
}
function printNode(node) {
// 定义一个数组表示模拟栈
let stack = new Array()
// 初始化当前节点为传入的节点
let NodeNextElm = node
//判断下个节点指针是否为空
while (NodeNextElm !== null) {
//压栈
stack.push(NodeNextElm.data)
//存储下个节点的指针
NodeNextElm = NodeNextElm.next
}
while (stock.length > 0) {
//当栈不为空时,循环弹出栈顶元素并打印
console.log(stack.pop())
}
}
//初始化链表
//新建链表节点
const node1 = new Node(1)
const node2 = new Node(2)
const node3 = new Node(3)
//手动存储下个节点的指针
node1.next = node2
node2.next = node3
//调用
printNode(node1)
过程解析
一. 进入,此时的NodeNextElm:{
"data": 1,
"next": {
"data": 2,
"next": {
"data": 3,
"next": null
}
}
}
此时进入while循环:
①第一次循环:
栈stack:[1]
NodeNextElm:{
"data": 2,
"next": {
"data": 3,
"next": null
}
}
②第二次循环:
栈stack:[1,2]
NodeNextElm:{
"data": 3,
"next": null
}
③第三次循环:
栈stack:[1,2,3]
NodeNextElm:null
循环结束
pop()弹出栈并打印:3,2,1
上述为个人整理内容,水平有限,如有错误之处,望各位园友不吝赐教!如果觉得不错,请点个赞和关注支持一下!谢谢~๑•́₃•̀๑ [鲜花][鲜花][鲜花]
【JavaScript】前端算法题(重建二叉树、反向输出链表每个节点)的更多相关文章
- FCC的javascript初级算法题解答
FCC上的javascript基础算法题 前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论.基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正 ...
- 小小c#算法题 - 11 - 二叉树的构造及先序遍历、中序遍历、后序遍历
在上一篇文章 小小c#算法题 - 10 - 求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.但在那篇文章中,只 ...
- 《剑指offer》— JavaScript(4)重建二叉树
重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序 ...
- LeetCode第114题:二叉树展开为链表
问题描述 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路 二叉树的一些算法题都可 ...
- Leetcode算法【114. 二叉树展开为链表】
上周通过一位小伙伴,加入了一个氛围很好的小群,人不多,但是大家保持着对知识的渴望,让我很感动. 我自己也有一个群,人数也不多,但是能真正互动起来一起学习,一起进步的,还是太少.所以,现在也在学习如何让 ...
- JS刷算法题:二叉树
Q1.翻转二叉树(easy) 如题所示 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 来源:力扣(LeetCode) ...
- 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历
/* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...
- [面试算法题]比较二叉树异同-leetcode学习之旅(5)
问题描述 Given two binary trees, write a function to check if they are equal or not. Two binary trees ar ...
- 前端算法题:找出数组中第k大的数字出现多少次
题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
随机推荐
- 在Mac上运行Rainbond,10分钟快速安装
前言 以往安装部署 Rainbond 的方式都无法绕过 Kubernetes 集群的搭建,无论是作为开发环境还是用于生产交付,部署的过程都非常依赖于服务器或云主机.这在体验 Rainbond 云原生应 ...
- docker lnmp配置
1.lnmp网络与目录规划 172.16.10.0/24 nginx:172.16.10.10 mysql:172.16.10.20 php:172.16.10.30 网站访问主目录:/wwwroot ...
- js 判断手机号格式
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...
- OpenTelemetry agent 对 Spring Boot 应用的影响:一次 SPI 失效的案例
背景 前段时间公司领导让我排查一个关于在 JDK21 环境中使用 Spring Boot 配合一个 JDK18 新增的一个 SPI(java.net.spi.InetAddressResolverPr ...
- openstack nova 报错
openstack compute service list The server is currently unavailable. Please try again at a later time ...
- ABC342
E 建反图 + 拓扑排序. 先求出直接与 \(n\) 连接的点的答,就是最后一辆车的发车时间.然后再做拓扑排序. 假如我们知道点 \(u\) 的答案为 \(ans_u\) 并且 \(u,v\) 相连, ...
- The remote name could not be resolved
HTTP The remote name could not be resolved HTTP Status:NameResolutionFailure
- 网络问题排查必备利器:Pingmesh
背景 当今的数字化世界离不开无处不在的网络连接.无论是日常生活中的社交媒体.电子商务,还是企业级应用程序和云服务,我们对网络的依赖程度越来越高.然而,网络的可靠性和性能往往是一个复杂的问题,尤其是在具 ...
- CAT监控指标
CAT监控指标 CAT 是基于 Java 开发的实时应用监控平台.官方文档:https://github.com/dianping/cat CAT提供以下几种报表:Transaction报表 一段代码 ...
- [笔记]Git常用命令大全
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` [笔记]Git常用命令大全 日期:2018-6-16 阿珏 ...