LeetCode 116. 填充每个节点的下一个右侧节点指针

这篇具有很好参考价值的文章主要介绍了LeetCode 116. 填充每个节点的下一个右侧节点指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

描述

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

示例

示例1
LeetCode 116. 填充每个节点的下一个右侧节点指针

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,‘#’ 标志着每一层的结束。

示例2

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

链接

https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/

解题思路

思路一: 广度优先遍历

  • 首先根元素入队
  • 当队列不为空的时候
  • 求当前队列的长度length
  • 依次从队列中取 length个元素进行处理, 先取出队列中的第一个节点node,当node不是最后一个时,将node.next指向队列的第一个,然后进入下一次迭代
/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function(root) {
    if (root == null) return root;
    let queue = [root];
    while(queue.length) {
        let len = queue.length;
        for (let i = 0; i < len; i++) {
            let node = queue.shift();
            if (i < len - 1) {
                node.next = queue[0];
            } 
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }  
    }
    return root;
};

时间复杂度: O(n), 其中 n 是二叉树的节点数
空间复杂度: O(n)

思路二: 使用已建立的 next 指针

分为两种情况:

  1. 两个子节点属于同一个父节点,则node.left.next = node.right;
  2. 不同父节点之间子节点, 由于已经在父节点这一层建立了 next 指针,因此可以直接通过第一个父节点的
    next 指针找到第二个父节点, 然后在它们的孩子之间建立连接, node.right.next = node.next.left;

实现代码如下:

/**
 * @param {Node} root
 * @return {Node}
 */ 
var connect = function(root) {
    if (root === null) return root; 
    let leftNode = root;
    while (leftNode.left != null) {
        let head = leftNode;
        while (head != null) {
            // 两个子节点属于同一个父节点
            head.left.next = head.right;
            if (head.next != null) {
                // 不同父节点之间子节点
                head.right.next = head.next.left;
            }
            // 指针向后移动
            head = head.next;
        }
        // 去下一层的最左的节点
        leftNode = leftNode.left;
    }
    return root;
}

时间复杂度: O(n), 其中 n 是二叉树的节点数
空间复杂度: O(1)

参考资料

https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-2-4/文章来源地址https://www.toymoban.com/news/detail-451292.html

到了这里,关于LeetCode 116. 填充每个节点的下一个右侧节点指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日一题】填充每个节点的下一个右侧节点指针 II

    【BFS】【树】【2023-11-03】 117. 填充每个节点的下一个右侧节点指针 II 为二叉树中的每一个节点填充下一个节点。 本题题目意思明确,我们只需要遍历二叉树每一层的节点,将节点的 next 指针指向同一层的下一个节点即可,属于二叉树层序遍历的基础题。 实现代码 复杂度分

    2024年02月05日
    浏览(40)
  • 力扣:117. 填充每个节点的下一个右侧节点指针 II(Python3)

    给定一个二叉树: 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为  NULL  。 初始状态下,所有 next 指针都被设置为  NULL  。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 示

    2024年02月07日
    浏览(45)
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

    2哥 : 3妹,听说你昨天去面试了,怎么样啊? 3妹 :嗨,别提了,让我回去等通知,估计是没有通知了, 还浪费我请了一天假。 2哥 : 你又请假了啊, 你是怎么跟你那个严厉的老板请假的。 3妹 :我说我2哥生病了,嘿嘿~ 2哥 :一猜就是说我生病了,自从你找工作,我这一年

    2024年02月05日
    浏览(44)
  • 117.填充每个节点的下一个右侧节点 II

    ​​ 题目来源:         leetcode题目,网址:117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) 解题思路:        按层遍历时修改 next 指针即可,每一层除最后一个元素 的next 指针指向空外,皆指向同层下一个元素。 解题代码: 总结:         官方题解给出了

    2024年02月06日
    浏览(44)
  • 随想录刷题笔记 —二叉树篇3 117填充每个节点的下一个右侧节点指针II 104二叉树最大深度 111二叉树最小深度

    和116的区别在于116是完美二叉树,而117中的结点并非左右子结点都存在。 解法一:队列 解法二:双循环代替队列 解法一:队列 使用depth标记深度,进行层序遍历,每遍历完一层,depth+1 解法二:递归 递归出口:传入结点为空,返回0 否则返回左子结点和右子结点返回值的最

    2024年02月19日
    浏览(45)
  • LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2024年02月01日
    浏览(72)
  • 每日一题——LeetCode1299.将每个元素替换为右侧最大元素

    方法一 个人方法:  题目意思就是求在i=1;i++的循环条件下,arr[i]-arr[arr.length-1]的最大值分别为多少,最后一项默认为-1 用slice方法可以每次把数组第一位去除,得到求最大值的目标数组 Math的max方法可以直接返回数组里的最大值 但是不能每次循环都求一遍目标数组的最大值,

    2024年01月23日
    浏览(55)
  • 面试算法53:二叉搜索树的下一个节点

    给定一棵二叉搜索树和它的一个节点p,请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如,在图8.9的二叉搜索树中,节点8的下一个节点是节点9,节点11的下一个节点是null。 解决这个问题的最直观的思路就是采用二叉树的中序遍历

    2024年02月06日
    浏览(38)
  • 2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,

    2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True 否则返回 False 。 一直向下的路径的意思是:从树中某个节点开始,一直连

    2024年02月03日
    浏览(47)
  • C#实现的下拉多选框,下拉多选树,多级节点

    今天给大家上个硬货,下拉多选框,同时也是下拉多选树,支持父节点跟子节点!该控件是基于Telerik控件封装实现的,所以大家在使用的过程中需要引用Telerik.WinControls.dll、Telerik.WinControls.UI.dll,还有一些相关的类库,大家有需要的可以去网上自己找,另外我也会把一些动态

    2024年04月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包