按照层序,从左到右遍历
2016-01-19 20:11
134 查看
给一个二叉树root,从root开始,按照层序从上到下,从左到右打印。
对于先序创建的二叉树:124##5##3
层序遍历节点的顺序为:12345
设计一个能够完成这样的任务的执行步骤:
由root,开始,打印root//第一层
打印root.left
打印root.right//第二层
再打印root.left.left
再打印root.left.right
在打印root.right.left
再打印root.right.right//第三层
依次类推下去
设计一个方法:levelorder(Node n)
后面的总要用到前面的保留的信息。想到使用栈记录。
这种思路户陷入到陷阱中!
正确的思路是:拿出当前的根节点,打印,判定其是否有孩子,如果有则将左孩子和有孩子放在依次进入到队列中。取队头,打印,继续判定其孩子的情况。直到队列为空。
一种算法需要考虑如何结束,而不能永无止境依靠手工一行一行代码堆积去实现。
“队列为空”就是终止的标志。
那么将以上的思路用伪代码写下了:
levelOrder(node root)
{
if(root!=null)
enqueue(root);//根入队列
while(queue is not empty)//队列不空
{
if(head.left!=null)
enqueue(head.left);//队头有左孩子
if(head.right!=null) enqueue(head.right);//队头有右孩子
print(outqueue());//队头出队,打印
}
}
对于先序创建的二叉树:124##5##3
层序遍历节点的顺序为:12345
设计一个能够完成这样的任务的执行步骤:
由root,开始,打印root//第一层
打印root.left
打印root.right//第二层
再打印root.left.left
再打印root.left.right
在打印root.right.left
再打印root.right.right//第三层
依次类推下去
设计一个方法:levelorder(Node n)
后面的总要用到前面的保留的信息。想到使用栈记录。
这种思路户陷入到陷阱中!
正确的思路是:拿出当前的根节点,打印,判定其是否有孩子,如果有则将左孩子和有孩子放在依次进入到队列中。取队头,打印,继续判定其孩子的情况。直到队列为空。
一种算法需要考虑如何结束,而不能永无止境依靠手工一行一行代码堆积去实现。
“队列为空”就是终止的标志。
那么将以上的思路用伪代码写下了:
levelOrder(node root)
{
if(root!=null)
enqueue(root);//根入队列
while(queue is not empty)//队列不空
{
if(head.left!=null)
enqueue(head.left);//队头有左孩子
if(head.right!=null) enqueue(head.right);//队头有右孩子
print(outqueue());//队头出队,打印
}
}
相关文章推荐
- bzoj:1187: [HNOI2007]神奇游乐园
- ASPNET5 依赖注入(Dependency Injection)
- 微服务与SOA的实践应用对比
- Android 事件分发keyEvent、touchEvent、hoverEvent
- Sql练习15题
- 2H开发板启动 android 4.0.3 系统
- Super和this的应用
- epoll
- Python【基础第一篇】
- 蓄电池浮充电和均充电
- leetcode 之 invert binary tree
- 一款天气app的温度曲线图的实现
- Tomcat服务器版本和编码对中文数据的影响
- 稳定排序和不稳定排序
- duilib中禁止一个窗口双击最大化
- 可执行程序的入口点在那里?
- 产品经理基本素养
- 数据说Data Shuo,专注于“大数据营销与推广”
- 基于rails的schedule网站开发(19):新的远程仓库,新的部署,远程分支使用
- Androidx学习笔记(7)--常见布局--相对布局