LeetCode Populating Next Right Pointers in Each Node II

LeetCode解题之Populating Next Right Pointers in Each Node II

原题

为二叉树的节点都添加一个next指针,指向跟它在同一高度的右边的节点,如果右边没有节点,就指向None。与 Populating Next Right Pointers in Each Node 的区别就是这里的二叉树可以是不完全二叉树。

注意点:

  • 最好只用常量的空间

例子:

输入:

         1
       /  \       2    3
     / \    \     4   5    7

输出:

         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL

解题思路

Populating Next Right Pointers in Each Node 中广度优先遍历的方法已经能够处理不是完全二叉树的情况,但没有做到常量空间,这里对代码进行一下优化。仔细想一下,既然上一层的节点已经通过next指针连起来了,那么就只要能得到上一层的第一个节点就可以依次把上一层节点的子节点串联起来了。通过添加一个假节点来标记当前行的首节点。其中root表示上一行遍历到的节点,node表示当前行的节点。

AC源码

# Definition for binary tree with next pointer.
class TreeLinkNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        self.next = None


class Solution(object):
    def connect(self, root):
        """ :type root: TreeLinkNode :rtype: nothing """
        dummy = TreeLinkNode(-1)
        node = dummy
        while root:
            while root:
                node.next = root.left
                node = node.next or node
                node.next = root.right
                node = node.next or node
                root = root.next
            root, node = dummy.next, dummy


if __name__ == "__main__":
    None

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

你可能感兴趣的:(LeetCode,算法,python,二叉树,广度优先遍历)