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
这个就是树的层遍历
/**
* 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;
LinkedList<TreeLinkNode> queue = new LinkedList<>();
TreeLinkNode tail = root;
queue.add(root);
while(queue.isEmpty() == false){
TreeLinkNode node = queue.poll();
if(node == null) break;
// System.out.print(node.val+", ");
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
node.next = queue.peek();
if(node == tail){
node.next = null;
tail = queue.peekLast();
// System.out.println();
}
}
}
}时间复杂度为O(N), 空间复杂度为O(H), N是节点个数,H是树的高度。
由于是完全二叉树,论坛上提供了一种空间复杂度O(1)的方法。
public void connect(TreeLinkNode root) {
if(root == null ) return;;
TreeLinkNode start = root;
while(start != null){
TreeLinkNode cur = start;
while (cur != null){
if(cur.left != null) cur.left.next = cur.right;
if(cur.right != null && cur.next != null) cur.right.next = cur.next.left;
cur =cur.next;
}
start = start.left;
}
}
本文介绍一种算法,用于填充完全二叉树中每个节点的next指针,使其指向右侧相邻节点,并提供两种实现方式:一种使用队列辅助的空间复杂度为O(H)的方法;另一种空间复杂度为O(1)的递归方法。
1505

被折叠的 条评论
为什么被折叠?



