leetcode -- Populating Next Right Pointers in Each Node I&II -- 再看简单常考

Populating Next Right Pointers in Each Node

https://leetcode.com/problems/populating-next-right-pointers-in-each-node/

http://www.cnblogs.com/zuoyuan/p/3745170.html

思路就是对于root,考虑完root.left.next = root.right之后,要考虑root.right.next指向哪里,这个时候就牵涉到root.next是否为None。见图
leetcode -- Populating Next Right Pointers in Each Node I&II -- 再看简单常考_第1张图片

Populating Next Right Pointers in Each Node II

https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/

相比较I,有些情况要排除掉。没什么技巧。

注意一定要先递归右子树,why?自己举例,如果先递归左子树,就有可能root.next没有左右子树,那么要找下一个next,但是因为没有先递归右子树,所以无法找到下一个next。如下图所示。

leetcode -- Populating Next Right Pointers in Each Node I&II -- 再看简单常考_第2张图片

参考http://www.cnblogs.com/zuoyuan/p/3745369.html

这里默认next的默认值为None

class Solution:
    # @param root, a tree node
    # @return nothing
    def connect(self, root):
        if root:
            if root.left and root.right:#左右子树都有
                root.left.next = root.right
                tmp = root.next
                while tmp:#可能tmp没有左右子树,就只能继续找next了。只要找到一个next存在左或者右子树,那么就可以break
                    if tmp.left: root.right.next = tmp.left; break
                    if tmp.right: root.right.next = tmp.right; break
                    tmp = tmp.next
            elif root.left:#只有左子树
                tmp = root.next
                while tmp:
                    if tmp.left: root.left.next = tmp.left; break
                    if tmp.right: root.left.next = tmp.right; break
                    tmp = tmp.next
            elif root.right:#只有右子树
                tmp = root.next
                while tmp:
                    if tmp.left: root.right.next = tmp.left; break
                    if tmp.right: root.right.next = tmp.right; break
                    tmp = tmp.next
            self.connect(root.right)#这里一定要注意先递归右子树,可以自己举例子
            self.connect(root.left)
            # @connect(root.right)should be the first!!!

你可能感兴趣的:(LeetCode)