首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

【JavaScript】前端算法题(重建二叉树、反向输出链表每个节点)

编程知识
2024年07月29日 23:39

前言

今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点

题目

重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {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

上述为个人整理内容,水平有限,如有错误之处,望各位园友不吝赐教!如果觉得不错,请点个赞和关注支持一下!谢谢~๑•́₃•̀๑ [鲜花][鲜花][鲜花]

From:https://www.cnblogs.com/nothavebug/p/18331362
本文地址: http://shuzixingkong.net/article/574
0评论
提交 加载更多评论
其他文章 痞子衡嵌入式:MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法。 两年前痞子衡写过一篇《i.MXRT1170下在线联合调试双核工程的三种方法(IAR篇)》,那篇文章详细介绍了 IAR 下调试 RT1170 双核工程的几
痞子衡嵌入式:MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法 痞子衡嵌入式:MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法 痞子衡嵌入式:MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法
如何在Arch Linux上构建Raspberry Pi虚拟环境
如何在Linux上构建Raspberry Pi虚拟环境 ​ 下面我们来讲讲如何使用QEMU来仿照树莓派环境。这里首先先分成两大类。第一类是跑比较老的,安全性较低的老树莓派,主要指代的是22年4月份发布之前的版本,这个版本当中,树莓派镜像自己内部就配置了一份默认的账户密码。对于之后的版本则不配备这种默
如何在Arch Linux上构建Raspberry Pi虚拟环境 如何在Arch Linux上构建Raspberry Pi虚拟环境 如何在Arch Linux上构建Raspberry Pi虚拟环境
LLM并行训练7-混合并行总结
概述 根据前面的系列文章, 对预训练大模型里用到的主要并行加速技术做了一系列拆分. 但是在实际的训练里往往是多种并行混合训练. 我们要怎么配置这些并行策略才能让训练框架尽可能的减少通信瓶颈, 提升GPU计算利用率呢? 这里的变量太多了, 以最简单的3D并行为例: 硬件层面有: 单台机器的卡数/卡间带
LLM并行训练7-混合并行总结 LLM并行训练7-混合并行总结 LLM并行训练7-混合并行总结
.NET周刊【7月第4期 2024-07-28】
国内文章 .NET 高性能缓冲队列实现 BufferQueue https://mp.weixin.qq.com/s/fUhJpyPqwcmb3whuV3CDyg BufferQueue 是一个用 .NET 编写的高性能的缓冲队列实现,支持多线程并发操作。 项目地址:https://github.c
.NET周刊【7月第4期 2024-07-28】 .NET周刊【7月第4期 2024-07-28】
全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现
本文主要介绍了在使用Python进行面向对象编程时,异常的层级和如何使用继承关系完成自定义自己项目中异常类,并以传感器数据采集为例进行讲解。
全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现 全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现 全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现
机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?)
详解是否要使用端到端的深度学习? 假设正在搭建一个机器学习系统,要决定是否使用端对端方法,来看看端到端深度学习的一些优缺点,这样就可以根据一些准则,判断的应用程序是否有希望使用端到端方法。 这里是应用端到端学习的一些好处,首先端到端学习真的只是让数据说话。所以如果有足够多的\((x,y)\)数据,那
机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?) 机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?) 机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?)
SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴
开心一刻 一大早,她就发消息质问我 她:你给我老实交代,昨晚去哪鬼混了? 我:没有,就哥几个喝了点酒 她:那我给你打了那么多视频,为什么不接? 我:不太方便呀 她:我不信,和你哥们儿喝酒有啥不方便接视频的? 她:你肯定有别的女人了! 我:你老公就坐在我旁边,我敢接? 前情回顾 SpringBoot2
SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴 SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴 SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴
云原生 .NET Aspire 8.1 新增对 构建容器、编排 Python的支持
.NET Aspire 用于云原生应用开发,提供用于构建、测试和部署分布式应用的框架,这些应用通常利用微服务、容器、无服务器体系结构等云构造。2024年7月23日宣布的新 8.1 版本是该平台自 5 月正式发布以来的第一次重大更新,Microsoft 对 .NET Aspire 的第一个重大更新As
云原生 .NET Aspire 8.1 新增对 构建容器、编排 Python的支持