48. Leetcode 116. 填充每个节点的下一个右侧节点指针 (二叉树-二叉树遍历)
程序员文章站
2022-03-03 10:54:29
...
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例 1:
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。
示例 2:
输入:root = []
输出:[]
"""
# 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: 'Optional[Node]') -> 'Optional[Node]':
# 方法一 层次遍历 迭代
if not root:
return root
queue = [root]
while queue:
size = len(queue)
tmp = queue[0]
for i in range(1,size):
tmp.next = queue[i]
tmp = queue[i]
for _ in range(size):
tmp = queue.pop(0)
if tmp.left:
queue.append(tmp.left)
if tmp.right:
queue.append(tmp.right)
return root
# 方法二 迭代
if not root:
return root
pre = root
while pre.left:
tmp = pre
while tmp:
tmp.left.next = tmp.right
if tmp.next:
tmp.right.next = tmp.next.left
tmp = tmp.next
pre = pre.left
return root
# 方法三 递归
def dfs(root):
if not root:
return
left = root.left
right = root.right
while left:
left.next = right
left = left.right
right = right.left
dfs(root.left)
dfs(root.right)
dfs(root)
return root
上一篇: 二叉树填充每个节点的下一个右侧节点指针
推荐阅读
-
【C语言 LeetCode 116】填充每个节点的下一个右侧节点指针
-
leetcode116. 填充每个节点的下一个右侧节点指针
-
leetcode117. 填充每个节点的下一个右侧节点指针 II
-
leetcode116. 填充每个节点的下一个右侧节点指针/层次遍历
-
leetcode116. 填充每个节点的下一个右侧节点指针
-
【leetcode】117. 填充每个节点的下一个右侧节点指针 II(populating-next-right-pointers-in-each-node-ii)(bfs)[中等]
-
leetcode116. 填充每个节点的下一个右侧节点指针
-
leetcode117. 填充每个节点的下一个右侧节点指针 II
-
leetcode 117. 填充每个节点的下一个右侧节点指针 II
-
leetcode 117. 填充每个节点的下一个右侧节点指针 II