【二叉树遍历算法】——广/深度优先搜索的实现
2015-10-17 13:37
453 查看
广度和深度优先搜索一般都是用于图的遍历,树也有,这里实现的是二叉树的广度和深度优先搜索。主要使用伪代码的方式实现,掌握基本的思想和过程即可,对应具体的编程语言实现起来也就大同小异了。
深度优先搜索
广度优先搜索
下面是我的理解和记住实现过程的几个技巧:
深度优先使用的是栈,因为涉及到回溯的问题;而广度优先使用的是队列,相当于每层从左到右逐个进入队列。
深度优先是根节点先进栈,其次每次弹栈的时候,先访问该栈顶结点,让右孩子先进栈,再让左孩子进栈,原因是栈是先进后出的,循环处理。
广度优先是根节点先进队列,其次都把出队的结点的左孩子和右孩子依次添加到队列中,直到队列为空。
深度优先搜索
void depthSearch(BiTree T){ InitStack(S); Push(S,T) while(!StackEmpty(S)){ Pop(S,p); visit(p); if(p->rChild) Push(S,p->rChild); if(p->lChild) Push(S,p->lChild); } }
广度优先搜索
void breathSearch(BiTree T){ InitQueue(Q); Push(Q,T); while(!QueueEmpty(Q)){ Pop(Q,p); visit(p); if(p->lChild) Push(Q,p->lChild); if(p->rChild) Push(Q,p->rChild); } }
下面是我的理解和记住实现过程的几个技巧:
深度优先使用的是栈,因为涉及到回溯的问题;而广度优先使用的是队列,相当于每层从左到右逐个进入队列。
深度优先是根节点先进栈,其次每次弹栈的时候,先访问该栈顶结点,让右孩子先进栈,再让左孩子进栈,原因是栈是先进后出的,循环处理。
广度优先是根节点先进队列,其次都把出队的结点的左孩子和右孩子依次添加到队列中,直到队列为空。
相关文章推荐
- java date String 类型相互转换
- 使用explain来优化查询SQL
- java中&和&&的区别
- Dubbo项目实战 (二) 注册中心zookeeper-3.4.6集群以及高可用
- Code Forces 585 C. Alice, Bob, Oranges and Apples(数论)
- 高并发读写压力如何处理?redis内存数据库使用场景引发的思考
- Dubbo项目实战 (二) 注册中心zookeeper-3.4.6集群以及高可用
- svn1.6在centos6下的使用
- 交换排序—冒泡排序(Bubble Sort)
- Codeforces 556A:Case of the Zeros and Ones
- 手机网页中的hover效果实现
- Codeforces 556A:Case of the Zeros and Ones
- Learn Python The Hard Way 习题41详解
- ios-封装日期控件
- web上线部署系统 Walle
- 进阶java程序员书籍推荐
- 信1407-2班20142897程怀远 《大道至简》第三章
- 收录一些常用的面试题目含参考答案(一)
- C++指向成员函数的指针
- Guava-EventBus使用笔记