Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
- You may only use constant extra space.
For example,
Given the following binary tree,
1 / \ 2 3 / \ \ 4 5 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL
这道题延续Populating Next Right Pointers in Each Node 的思路,使用层搜和上一层的linkedlist连接实现O(1)的空间复杂度,但是实际实现时因为不是完全二叉树,不能直接通过上一层建立下一层的连接(时间复杂度高)。而需要同时保存下一层的prev已方便连接。实现时需要判断当前上层结点是否有左右子树,代码如下:
class Solution(object): def connect(self, root): """ :type root: TreeLinkNode :rtype: nothing """ if not root: return head = root #low level's start node prev = None #low level's previous node upCur = None # higher level's currrent node while(head): upCur = head prev = None head = None while upCur: if upCur.left: if prev == None: prev = upCur.left head = prev else: prev.next = upCur.left prev = prev.next if upCur.right: if prev == None: prev = upCur.right head = prev else: prev.next = upCur.right prev = prev.next upCur = upCur.next
另外一种需要判断的代码如下:
class Solution(object): def connect(self, root): """ :type root: TreeLinkNode :rtype: nothing """ if not root: return leftMost = root #higher level point while leftMost: prev = leftMost while prev and (not prev.left) and (not prev.right): #no low level nodes should be connected prev = prev.next if not prev: #the lowest level of tree return leftMost = prev.left if prev.left else prev.right #for the next loop, leftMost is not None cur = leftMost while(prev): #higer level's node if cur == prev.left: if prev.right: #if root.right is not None, find the child of other nodes cur.next = prev.right cur = cur.next prev = prev.next elif cur == prev.right: prev = prev.next #can't connected directedly. else: if (not prev.left) and (not prev.right): prev = prev.next continue #can't find cur.next through this root cur.next = prev.left if prev.left else prev.right cur = cur.next
这种解法分情况讨论目前遍历到的下一层结点和目前当前层结的关系,讨论比较复杂。不如上面那种解法方便。