苏小咪 发表于 2024-7-30 05:07:19

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

前言

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

重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路

前序遍历(根左右)和中序遍历(左根右)

思路就是使用递归把他分化为每个小的二叉树,然后都根据前序遍历(根左右)和中序遍历(左根右)的特性,前序的首元素就是根,然后再找到中序的根,根的左边就是左右边就是右,再进行递归,直到前序为null的时候就代表没有根节点了,那这个元素就是尾节点
一.
①,-> val=>1 ->L(,) & R(,)    根节点 1 ,有左右节点
二.
①L(,)->val=>2->L(,) && R(null , null)   根节点2(属1的左节点) ,有左节点,无右节点
②R(,)->val=>3->L(,) && R(,)   根节点3(属1的右节点) ,有左右节点
三.
①L(,)->val=>4 -> L(null , null) && R(,)             根节点4(属2的左节点) ,有右节点,无左节点
②R(,) -> val=>6 -> L( , )&& R(null , null)          根节点6(属3的右节点),有左节点,无右节点
③L(,) -> val=>5->(null,null)->终止                              尾节点5(属3的左节点)
四.
①R(,) -> val=>7 ->终止                                          尾节点7(属4的右节点)
②L(,) -> val=>8 ->终止                                          尾节点8(属6的左节点)
代码实现

function rebuildBinaryTree(front, centre) {
    //判断是否为空节点
    if (!front || front.length == 0) {
      return null;
    }
    // 根节点
    var TreeNode = {
      val: front
    };
    for (var i = 0; i < front.length; i++) {
      //找到中序遍历根节点位置
      if (centre === front) {
            //中序遍历(左根右)
            //根节点左边的节点为该节点的左边
            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(, )
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:

NodeNextElm:{
        "data": 2,
        "next": {
                "data": 3,
                "next": null
        }
}

②第二次循环:

栈stack:

NodeNextElm:{
        "data": 3,
        "next": null
}

③第三次循环:

栈stack:

NodeNextElm:null

循环结束

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

来源:https://www.cnblogs.com/nothavebug/p/18331362
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【JavaScript】前端算法题(重建二叉树、反向输出链表每个节点)