leetcode系列-填充每个节点的下一个右侧节点指针(populating next right pointers in each node)(多种解法)

该博客主要介绍了LeetCode中的填充每个节点的下一个右侧节点指针问题,涉及两种解法:层次遍历(使用队列实现)和拉链法。层次遍历通过队列逐层处理节点,拉链法则通过递归完成节点间的连接。文章提供了详细的解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分类:Tree

难度:medium

方法:1.层级遍历 2.拉链法

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

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

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

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

示例:

在这里插入图片描述

题解

  1. 方法一:层次遍历(使用队列实现)
  2. 方法二:拉链法
    递归的方法,逻辑为:很显然左孩子的next要连到右孩子
    然后左孩子的右孩子和右孩子的左孩子应该有连线,这样在一个循环中就完成了2->3和5->6的连接(完成了以当前节点为中心的拉链,好形象),然后左右孩子分别递归下去即可

代码

层次遍历

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val=0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""
# 层次遍历
class Solution(object):
    def connect(self, root):
        """
        :type root: Node
        :rtype: Node
        """
        if root:
            queue = [root]
            prev_node = None
            while queue:
                l = len(queue)
                for i in range(l):
                    node = queue.pop(0)
                    if prev_node:
                        prev_node.next =  node
                    prev_node = node
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                prev_node = None
        return root
        

拉链法

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val=0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""
# 拉链法
class Solution(object):
    def connect(self, root):
        """
        :type root: Node
        :rtype: Node
        """
        def helper(node):
            if not node:
                return 
            left = node.left
            right = node.right
            while left:
                left.next = right
                right = right.left
                left = left.right
            helper(node.left)
            helper(node.right)
        helper(root)
        return root
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值