广度优先遍历二叉树

算法题

定义二叉树,单个节点的数据结构描述如下:

class Node{
	Node left;
	Node right;
	Node next;
}

在不使用其它数据结构的情况下,按广度优先遍历填充每个节点的next为下一个遍历的节点,为了避免复杂讨论,假设二叉树为满二叉树,若不是满二叉树,也可以通过完善边界条件来实现,思路是一致的。

思路如下(序号不代表执行步骤的顺序,以下仅仅描述对单的节点的操作):

  1. 对根节点操作:
    root.next = root.left;
    
  2. 除此之外,对于每个节点(包括根节点)做如下操作:
    // 对子节点的next赋值为自身,使得访问子节点时可以调用父节点
    if (node.left != null)
    	node.left.next = node;
    if (node.right != null)
    	node.right.next = node;
    
  3. 对除根节点之外的所有节点:
    if (node.equals(node.next.left)){ // 为父节点的左节点的情况
    	node.next = node.next.right;
    } else { // 为右节点的情况
    	node.next = node.next.next.left; // 假设 node.next.next.left 为空,则说明遍历到头
    }
    
  4. 当一个节点完成以上所有操作后,若它的next不为空,则对它的next重复以上操作。

若不是满二叉树,则需要讨论单个节点左节点为空、右节点为空和都为空的情况,以及添加新的对于终点条件的判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值