美文网首页
python实现leetcode之116. 填充每个节点的下一个

python实现leetcode之116. 填充每个节点的下一个

作者: 深圳都这么冷 | 来源:发表于2021-10-01 00:03 被阅读0次

解题思路

完美二叉树的叶子层是满的,所以,树的大小就是2height+1
第一步 先计算树的大小
第二步 申请同样大小的列表,然后将节点放在列表里,因为是二叉树,所以有堆的性质,父节点在idx/2处,左孩子在idx
2,右孩子在idx
2+1
第三步 设置next节点,同一层的,比如第三层4,5,6,7,任何连续两个的and都不会是0,相反从第三层到第四层7-8的and就是0
arr_idx & arr_idx+1为0表示到当前层的末梢

116. 填充每个节点的下一个右侧节点指针

代码

"""
# 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 not root: return root
        arr = [None for _ in range(perfect_btree_size(root))]
        put(root, arr, 1)
        arr_idx = 1
        while arr[arr_idx]:
            if arr_idx & (arr_idx + 1) == 0:
                pass  # arr[arr_idx].next = NULL
            else:
               arr[arr_idx].next = arr[arr_idx + 1]
            arr_idx += 1
        return root


def perfect_btree_size(tree, depth=0):
    if not tree: return 2**depth + 1
    return perfect_btree_size(tree.right, depth+1)


def put(tree, li, idx):
    li[idx] = tree
    if tree.left: put(tree.left, li, idx*2)
    if tree.right: put(tree.right, li, idx*2 + 1)
效果图

相关文章

网友评论

      本文标题:python实现leetcode之116. 填充每个节点的下一个

      本文链接:https://www.haomeiwen.com/subject/jseynltx.html