题目:
每层处理有2^(depth-1)个节点,depth表示树的深度,每层最后一个节点不需处理
从队列取出节点连接到前一个节点的next域时,仅当节点是该层的倒数第二个节点时需要出队列,并将其左右子节点加入队列,否则使用peek取节点即可
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
想法:用一个队列,层次遍历每个节点,每层的最后一个节点不处理
public void connect(TreeLinkNode root) {
if (root == null || root.left == null) {
return ;
}
Deque<TreeLinkNode> queue = new ArrayDeque<TreeLinkNode>();
queue.add(root.left);
queue.add(root.right);
int depth = 1;
while (!queue.isEmpty()) {
depth++;
TreeLinkNode node = null;
TreeLinkNode pollNode = null;
for (int i=0; i<Math.pow(2, depth-1)-1; i++) {
node = queue.poll();
if (i == Math.pow(2, depth-1)-2) {
pollNode = queue.poll();
node.next = pollNode;
} else {
node.next = queue.peek();
}
if (node.left != null) {
<span style="white-space:pre"> </span>queue.add(node.left);
<span style="white-space:pre"> </span>}
if (node.right != null) {
queue.add(node.right);
}
if (pollNode != null && pollNode.left != null) {
queue.add(pollNode.left);
}
if (pollNode != null && pollNode.right != null) {
queue.add(pollNode.right);
}
}
}
}
每层处理有2^(depth-1)个节点,depth表示树的深度,每层最后一个节点不需处理
从队列取出节点连接到前一个节点的next域时,仅当节点是该层的倒数第二个节点时需要出队列,并将其左右子节点加入队列,否则使用peek取节点即可