[LeetCode] 116. Populating Next Right Pointers in Each Node

45 篇文章 0 订阅

原题链接:https://leetcode.com/problems/populating-next-right-pointers-in-each-node/

1. 题目介绍

You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:
给出一个完全二叉树,所有的树叶都在同一层,每一个父节点都有两个子节点。这个二叉树的节点是如下定义的:

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

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.
Initially, all next pointers are set to NULL.

将每个节点的指针都指向和自己在同一层的、右侧的节点。如果节点的右侧没有节点了,那么就需要将自己的next指针设置为null。
在最初,所有节点的next指针都是null。

Example:
在这里插入图片描述

在这里插入图片描述
Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B.
给出上面的完全二叉树(图A),你的函数需要将每一个节点的next指针指向同一层的右侧节点,如同图B一样。

Note:
You may only use constant extra space.
Recursive approach is fine, implicit stack space does not count as extra space for this problem.
只可以使用常数级别的空间复杂度。
递归的解法是可以的,递归程序占用的栈空间不计算入空间复杂度。

2. 解题思路

https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/la-la-lian-jie-fa-by-sorcerer/ 中,sorcerer提出了一种拉拉链的解法,非常巧妙,因此以下思路采用了sorcerer的解法。

可以想象,沿着树的根节点,有一根竖直的对称轴,所有节点都关于这条对称轴对称。
我们需要将每一层的所有节点中,最靠近对称轴的2个节点连接起来。需要用左侧的节点的next指针,指向右侧节点。
重复上面的步骤,就可以完成对一棵树所有节点next指针的设定了。

实现代码

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}

    public Node(int _val,Node _left,Node _right,Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/
class Solution {
    public Node connect(Node root) {
        if(root == null){
            return null;
        }
        Node l = root.left;
        Node r = root.right;
        //以根节点为中心,有一条竖直的对称轴
        //不断将紧邻对称轴的左侧节点的next指向右侧节点
        while(l != null){
            l.next = r;
            l = l.right;
            r = r.left;
        }
        connect(root.left);
        connect(root.right);
        return root;
    }
}

3. 参考资料

https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/la-la-lian-jie-fa-by-sorcerer/

根据引用\[1\]、\[2\]和\[3\]的代码,这是一个解决LeetCode 116题的Python代码。这个问题是关于填充每个节点的下一个右侧节点指针,使其指向其右侧节点的题目。代码中定义了一个Node类,其中包含了节点的值、左子节点、右子节点和下一个右侧节点指针。代码中的Solution类包含了一个connect方法,用于连接每个节点的下一个右侧节点指针。具体的实现方式有几种不同的方法,包括使用队列层序遍历、递归和带记忆的前序遍历。你可以根据自己的喜好选择其中一种方法来解决这个问题。 #### 引用[.reference_title] - *1* [【LeetCode116. Populating Next Right Pointers in Each Node 解题报告(Python)](https://blog.csdn.net/L141210113/article/details/107134602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【LeetCode116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题...](https://blog.csdn.net/fuxuemingzhu/article/details/79559645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode116题—填充每个节点的下一个右侧节点指针—Python实现](https://blog.csdn.net/qq_16184125/article/details/117201474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值