您的位置:首页 > Web前端 > Node.js

116. Populating Next Right Pointers in Each Node

2017-07-17 05:29 351 查看
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++;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: