当对二叉树进行层次遍历的时候,如何才能对不同层次的节点做隔离,主要有三个办法:
方法一:数组长度做隔离
获取当前的队列的长度length,一次只遍历length个节点,后续加入的元素在下一次循环遍历
queue = [node] // 新建一个队列,并将根节点放入队列
while queue.lengh != 0
length = queue.length // 获取当前队列的长度
while length > 0 // 只弹出length 个节点
item = queue.shift // 弹出队列的头部元素
do_something(item) // 操作该节点:比如存入一个数组或者打印
queue.push(item.left) if item.left // 将左子节点存入队列
queue.push(item.right) if item.right // 将右子节点存入队列
length--
方法二:使用分隔符
在不同层次的节点之间加入一个分隔符,遍历发现分隔符的时候,停止当前遍历
queue = [node] // 新建一个队列,并将根节点放入到队列
while queue.lengh != 0
queue.push "$" // 将分割符放入队列
while(true) // 做一个无限循环
item = queue.shift // 弹出队列的头部元素
break if item == '$' // 如果当前的节点等于分隔符,说明该层已经遍历到了最右边
do_something(item) //操作该节点
queue.push(item.left) if item.left // 将左子节点存入队列
queue.push(item.right) if item.right // 将右子节点存入队列
方法三:使用深度优先搜索
用一个level字段来保存深度,在深度优先遍历的时候,判断一下当前结点的深度即可
ans = [] // 用一个数组来保存值
level = 0 // 根节点的level 是0
visit(node,ans,level)
def visit(node,ans,level):
return if node is null // 如果节点为空,则返回
//逻辑处理部分
if ans.lengh > level //说明之前访问过该层的节点
ans.[level].push node.val
else //说明之前level没有访问过
ans.[level] = [node.val]
visit (node.left, level + 1,ans)
visit (node.right, level + 1,ans)