算法题
定义二叉树,单个节点的数据结构描述如下:
class Node{
Node left;
Node right;
Node next;
}
在不使用其它数据结构的情况下,按广度优先遍历填充每个节点的next为下一个遍历的节点,为了避免复杂讨论,假设二叉树为满二叉树,若不是满二叉树,也可以通过完善边界条件来实现,思路是一致的。
思路如下(序号不代表执行步骤的顺序,以下仅仅描述对单的节点的操作):
- 对根节点操作:
root.next = root.left;
- 除此之外,对于每个节点(包括根节点)做如下操作:
// 对子节点的next赋值为自身,使得访问子节点时可以调用父节点 if (node.left != null) node.left.next = node; if (node.right != null) node.right.next = node;
- 对除根节点之外的所有节点:
if (node.equals(node.next.left)){ // 为父节点的左节点的情况 node.next = node.next.right; } else { // 为右节点的情况 node.next = node.next.next.left; // 假设 node.next.next.left 为空,则说明遍历到头 }
- 当一个节点完成以上所有操作后,若它的next不为空,则对它的next重复以上操作。
若不是满二叉树,则需要讨论单个节点左节点为空、右节点为空和都为空的情况,以及添加新的对于终点条件的判断。