leetcode-python3算法-填充每个节点的下一个右侧节点指针

这篇博客介绍了如何填充二叉树每个节点的next指针,使其指向右侧相邻节点。首先,博主提出层次遍历的解决方案,然后分享了一个更巧妙的层次遍历实现,它通过next属性直接连接节点,节省空间和时间。最后,文章提到了递归解法,详细阐述了如何通过递归更新节点的next指针。

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

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

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

在这里插入图片描述
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
2.思路:

  1. 看到图首先想到就是利用层次遍历,从左到右依次遍历每个节点中的next属性,将其指向下一个节点。
    对应代码:
"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, left, right, next):
        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 not root:
            return 
        node = [root]
        while node:
            l =len(node)
            for n in range(l):
                cur = node.pop(0)
                if n < (l-1):
                    cur.next = node[0]
                if cur.left:
                    node.append(cur.left)
                if cur.right:
                    node.append(cur.right)
        return root

2.后面看到答案里有更巧妙的层次遍历。记录下来学习
对应代码:

class Solution:
    # @param root, a tree link node
    # @return nothing
    def connect(self, root):
        if not root:
            return
        pre = root
        while pre.left:
            current = pre # 利用current遍历每一层的节点
            while current:
                current.left.next = current.right
                if current.next:
                    current.right.next = current.next.left
                current = current.next
            # 每一层节点遍历完毕后,从上一层的节点的左节点从左到右依次遍历下一层的节点    
            pre = pre.left 
        return root
        

该代码没有像我的方法中那样在遍历时建立一个用于存放节点的列表,而是每行直接从最左边开始,利用了next属性进行遍历。这样的好处不仅节省了空间,也避免弹出节点节约了时间。
3. 递归解法

  • 针对于每一个节点node,先判断是否有子节点,如果有,则左右节点都有(题目给的是完美二叉树),那就把该node节点的左节点的next指针指向它的右节点;接着判断该node节点的next指向的是否为空,如果不为空则将它的右节的next指向下一个节点的左节点。
    代码如下:
"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, left, right, next):
        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 and root.left:  
            root.left.next = root.right 
            if root.next:
                root.right.next = root.next.left
            else:
                root.right.next = None
            self.connect(root.left)
            self.connect(root.right)
        return root

如果觉得对你有帮助的话,右上角,赞一波。谢谢支持!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值