116. Populating Next Right Pointers in Each Node
Given a binary tree
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL
.
Initially, all next pointers are set to NULL
.
Note:
- You may only use constant extra space.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For example,
Given the following perfect binary tree,
1 / \ 2 3 / \ / \ 4 5 6 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL
时间复杂度:o(n) 空间复杂度:O(1),因为记录了next指针,可以在层里查找同层的下一个元素,在做层序遍历时不用用到queue,减少了时间复杂度。
机智,即使是相同的办法,在不同的条件下,可以有优化。比如这题里,想想为啥层序遍历要用queue,为了找到上一层的下一个元素。如果有了next指针,不用queue也能找到上一层的下一个元素,得到一个优化解法。 30%
/** * Definition for binary tree with next pointer. * public class TreeLinkNode { * int val; * TreeLinkNode left, right, next; * TreeLinkNode(int x) { val = x; } * } */ public class Solution { public void connect(TreeLinkNode root) { if (root == null) { return; } root.next = null; TreeLinkNode prevLevelStart = root, prev, cur; while (prevLevelStart.left != null) { prev = prevLevelStart; cur = prevLevelStart.left; while (prev != null) { if (cur == prev.left) { cur.next = prev.right; } else { prev = prev.next; if (prev == null) { cur.next = null; } else { cur.next = prev.left; } } cur = cur.next; } prevLevelStart = prevLevelStart.left; } } }
相当与层序遍历,在遍历一层时,把一层里的元素前后连起来。 9% 时间+空间复杂度: O(n)
/** * Definition for binary tree with next pointer. * public class TreeLinkNode { * int val; * TreeLinkNode left, right, next; * TreeLinkNode(int x) { val = x; } * } */ public class Solution { public void connect(TreeLinkNode root) { ArrayDeque<TreeLinkNode> queue = new ArrayDeque<TreeLinkNode>(); if (root == null) { return; } int size = 0, i = 0; TreeLinkNode tmp = null; queue.offer(root); while (!queue.isEmpty()) { size = queue.size(); i = 0; while (i < size) { tmp = queue.poll(); if (tmp.left != null) { queue.offer(tmp.left); } if (tmp.right != null) { queue.offer(tmp.right); } if (i != size - 1) { tmp.next = queue.peek(); } else { tmp.next = null; } i++; } } } }