116. 填充每个节点的下一个右侧节点指针 二叉树 逆序BFS O(n)/ 利用 father.next遍历下层节点 O
Posted ChevisZhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了116. 填充每个节点的下一个右侧节点指针 二叉树 逆序BFS O(n)/ 利用 father.next遍历下层节点 O相关的知识,希望对你有一定的参考价值。
思路:
法1. 本题逆序BFS,从右到左记录每一个level的visited, 但是这样就用了O(n)的额外空间
法2. 官答
1) 左子节点永远指向右子节点
2)右子节点指向 None或者 父节点相邻节点的左子节点
if fatherNode.next: fatherNode.right.next = fatherNode.next.left
难点:
1)本题没想到的地方就是,利用上层节点.next的操作,能遍历完整的下层节点,这样就完成对右节点.next的赋值
代码:
"""
# 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
"""
法1)class Solution:
def connect(self, root: \'Node\') -> \'Node\':
visited = []
def helper(node,level):
if not node:
return
if len(visited) == level:
visited.append([])
node.next = None
else:
node.next = visited[level][0]
visited[level].pop()
visited[level].append(node)
helper(node.right,level+1)
helper(node.left,level+1)
helper(root,0)
return root
法2)
class Solution:
def connect(self, root: \'Node\') -> \'Node\':
if not root:
return root
leftMost = root
while leftMost.left:
point = leftMost
while point:
# 对某节点,连接其左右子节点
point.left.next = point.right
# 如果其右边还有节点
if point.next:
point.right.next = point.next.left
else:
point.right.next = None
point = point.next
leftMost=leftMost.left
return root
以上是关于116. 填充每个节点的下一个右侧节点指针 二叉树 逆序BFS O(n)/ 利用 father.next遍历下层节点 O的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode No.116 填充每个节点的下一个右侧节点指针
[LeetCode] 116. 填充每个节点的下一个右侧节点指针
LeetCode第116题—填充每个节点的下一个右侧节点指针—Python实现