首页 > 编程语言 >数据结构与算法之二叉树: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)

数据结构与算法之二叉树: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)

时间:2025-01-12 13:58:32浏览次数:3  
标签:Node right val next 117 二叉树 null 节点 left

填充每个节点的下一个右侧节点指针 II

描述

  • 给定一个二叉树:
    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }
    
  • 填充它的每个 next 指针,让这个指针指向其下一个右侧节点
  • 如果找不到下一个右侧节点,则将 next 指针设置为 NULL
  • 初始状态下,所有 next 指针都被设置为 NULL

示例 1

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2

输入:root = []
输出:[]

提示

  • 树中的节点数在范围 [0, 6000] 内
  • -100 <= Node.val <= 100
  • 进阶:
    • 你只能使用常量级额外空间
    • 使用递归解题也符合要求,本题中递归程序的隐式栈空间不计入额外空间复杂度

Typescript 版算法实现


1 )方案1: 层次遍历

/**
 * Definition for _Node.
 * class _Node {
 *     val: number
 *     left: _Node | null
 *     right: _Node | null
 *     next: _Node | null
 * 
 *     constructor(val?: number, left?: _Node, right?: _Node, next?: _Node) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function connect(root: _Node | null): _Node | null {
    if (root === null) return null;
    const queue = [root];
    while (queue.length) {
        const n = queue.length;
        let last = null;
        for (let i = 1; i <= n; ++i) {
            let f = queue.shift();
            if (f.left !== null) queue.push(f.left);
            if (f.right !== null) queue.push(f.right);
            if (i !== 1) last.next = f;
            last = f;
        }
    }
    return root;
};

2 )方案2: 使用已建立的 next 指针

/**
 * Definition for _Node.
 * class _Node {
 *     val: number
 *     left: _Node | null
 *     right: _Node | null
 *     next: _Node | null
 * 
 *     constructor(val?: number, left?: _Node, right?: _Node, next?: _Node) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

let last: Node | null = null;
let nextStart: Node | null = null;

/**
 * @param {Node} root
 * @return {Node}
 */
function connect(root: Node | null): Node | null {
    if (root === null) return null;

    let start: Node | null = root;

    while (start !== null) {
        last = null;
        nextStart = null;

        for (let p: Node | null = start; p; p = p.next) {
            if (p.left) handle(p.left);
            if (p.right) handle(p.right);
        }

        start = nextStart;
    }

    return root;
}

// 处理节点的函数
function handle(p: Node | null): void {
    if (last !== null) last.next = p;
    if (nextStart === null) nextStart = p;
    last = p;
}

标签:Node,right,val,next,117,二叉树,null,节点,left
From: https://blog.csdn.net/Tyro_java/article/details/145009050

相关文章

  • 【Java】二叉树:数据海洋中灯塔式结构探秘
    二叉树(BinaryTree)是一种基础且重要的树形数据结构,它是数据存储和操作的基础,广泛应用于各种场景,如数据库索引、图像处理、解析表达式等。在各种树形数据结构中,二叉树就像一座灯塔,引导我们在复杂的数据海洋中高效地进行数据处理。在本篇文章中,我们将深入探讨二叉树的基本......
  • 代码随想录算法训练营第4天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面
    一、刷题部分1.124.两两交换链表中的节点原文链接:代码随想录题目链接:24.两两交换链表中的节点-力扣(LeetCode)1.1.1题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输......
  • 如何查找两个DOM节点的最近公共父节点
    在前端开发中,如果你需要找到两个DOM节点的最近公共父节点,可以使用JavaScript提供的DOMAPI来实现。以下是一个简单的函数,该函数接受两个DOM节点作为参数,并返回它们的最近公共父节点:functionfindClosestCommonParent(node1,node2){//获取节点1的所有父节点c......
  • 94. 二叉树的中序遍历
    目录题目递归题目给定一个二叉树的根节点root,返回它的中序遍历。递归varinorderTraversal=function(root){constres=[]//结果数组constinorder=(root)=>{//递归函数if(root===null)return//遇到空(底)返回inorder(root.left)/......
  • 服务器多节点 Grafana、Prometheus 和 Node-Exporter Docker版本部署指南
    要在多台服务器上部署Grafana、Prometheus和Node-Exporter,并且其中一台服务器专门用于Grafana和Prometheus的部署1.准备工作服务器信息:Server1:用于部署Grafana和Prometheus。Server2-n:用于部署Node-Exporter。Docker:确保所有服务器上已安装Docker......
  • 二叉树层序遍历 Leetcode102.二叉树的层序遍历
    二叉树的层序遍历相当于图论的广度优先搜索,用队列来实现(二叉树的递归遍历相当于图论的深度优先搜索)102.二叉树的层序遍历给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[......
  • 【Web】0基础学Web—节点操作、发表神评妙论、事件添加和移除、事件冒泡和事件捕获
    0基础学Web—节点操作、发表神评妙论、事件添加和移除、事件冒泡和事件捕获节点操作创建节点末尾追加子节点插入节点将一个节点插入到一个父元素的最前面删除节点替换节点发表神评妙论案例cssbodyjs事件添加和移除事件监听事件冒泡和捕获节点操作创建节点<script......
  • 代码随想录:翻转二叉树
    代码随想录:翻转二叉树就是遍历/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(null......
  • 代码随想录:对称二叉树
    代码随想录:对称二叉树递归挺巧妙的,平时我肯定会用层次遍历,然后双指针看数组是否对称。递归代码:/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),......
  • 完全二叉树的删除
    (1)删除叶子节点找到要删除的节点targetNode找到要删除节点的父节点parent(父节点是否存在)要删除的节点是父节点的左子树还是右子树如果是左子树,则parent.left=null;如果是右子树则parent.right=null。(2)删除只有一个子节点的节点找到要删除的节点targetNode找到......