分类:Tree
难度:medium
方法:1.层级遍历 2.拉链法
- 填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例:
题解
- 方法一:层次遍历(使用队列实现)
- 方法二:拉链法
递归的方法,逻辑为:很显然左孩子的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