LeetCode:117. 填充每个节点的下一个右侧节点指针 II

  1. 填充每个节点的下一个右侧节点指针 II
    难度
    中等

给定一个二叉树

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

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

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

进阶:

你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例:

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

提示:

树中的节点数小于 6000
-100 <= node.val <= 100

方法一:
直接层序遍历,使用一个队列存储节点,为了方便标记每层的节点数,设置变量l,r标记队列当前的位置,last标记每层的最后一个节点位置。

"""
# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""

class Solution:
    def connect(self, root: 'Node') -> 'Node':
        import collections
        queue = collections.deque()
        def BFS(root):
            if root ==None:
                return
            queue.append(root)
			##l,r标记当前队列的起点和终点,last标记每层的末尾位置
            l, r, last = 0, 1, 1
            while len(queue) > 0:
                p = queue.popleft()
                l += 1
                if l != last and len(queue) > 0:
                    p.next = queue[0]

                if p.left:
                    queue.append(p.left)
                    r += 1
                if p.right:
                    queue.append(p.right)
                    r += 1
                ##每当l到达每层的末尾时,更新last
                if l == last:
                    last = r
        BFS(root)
        return root

时间复杂度:O(N)
空间复杂度:O(N)

方法二:

依然采用层序遍历的思想,只不过不再使用队列存储节点,而是借用next指针,进行层序遍历,在遍历当前层的同时,把下层节点串起来,如此迭代。
注意:为了统一操作,需要在下层节点起始处,添加一个头部节点,标记为dummy。

"""
# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""

class Solution:
    def connect(self, root: 'Node') -> 'Node':   
        if root ==None:
            return
        cur= root
        
        while cur !=None:    
        	##起始节点,统一操作          
            dummy = Node(-9999)        
            pre = dummy
            while cur != None:                 
                if cur.left:
                    pre.next = cur.left
                    pre = cur.left
                if cur.right:
                    pre.next = cur.right
                    pre = cur.right
                cur = cur.next
            cur = dummy.next
        return root

时间复杂度:O(N)
空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值