java算法:树遍历
在给定一棵树的前提下,系统的处理树中的每个结点。
在链表中,沿着单个指针从一个结点移动到另一个结点;但对于树,必须做出某种决策,因为有多个指针可走。
二叉树:
前序:先访问结点,再访问左子树和右子树。
中序:先访问左子树,在访问结点,然后访问右子树
后续:先访问左右子树,再访问结点。
例1:递归树遍历
- privatevoidtraverseR(Nodeh){
-
if(h==null){
-
return;
- }
- h.item.visit();
- traverseR(h.l);
- traverseR(h.r);
- }
-
voidtraverse(){
- traverse(root);
- }
private void traverseR(Node h){
if(h == null){
return;
}
h.item.visit();
traverseR(h.l);
traverseR(h.r);
}
void traverse(){
traverse(root);
}
考虑使用明确堆栈的非递归实现也是很有用的。先考虑能存放项或树的抽象栈,用要被遍历的树进行初始化。然后,进入循环过程,在那里弹出并处理栈中的顶端元素,继续进行直到栈为空。如果弹出的实体是一项,对它访问;如果是一棵树,则执行一系列指定顺序的压入操作:
对于前序:压入右子树,然后是左子树,再后是结点。
对于中序:压入右子树,然后是结点,在后是左子树。
对于后序:压入结点,然后是右子树,在后是左子树。
例2:前序遍历(非递归)
- privatevoidtraverseS(Nodeh){
-
NodeStacks=newNodeStack(max);
- s.push(h);
-
while(!s.empty()){
- h=s.pop();
- h.item.visit();
-
if(h.r!=null){
- s.push(h.r);
- }
-
if(h.l!=null){
- s.push(h.l);
- }
- }
- }
-
voidtraverseS(){
- traverseS(root);
- }
private void traverseS(Node h){
NodeStack s = new NodeStack(max);
s.push(h);
while(!s.empty()){
h = s.pop();
h.item.visit();
if(h.r != null){
s.push(h.r);
}
if(h.l != null){
s.push(h.l);
}
}
}
void traverseS(){
traverseS(root);
}
通过使用队列替代栈可以实现层序遍历,对于前序,使用LIFO数据结构,对于层序,使用FIFO数据结构。层序并不对于与树的递归结构有关的递归的实现。
例3:层序遍历
- privatevoidtraverseQ(Nodeh){
-
NodeQueueq=newNodeQueue(max);
- q.push(h);
-
while(!q.empty()){
- h=q.get();
- h.item.visit();
-
if(h.r!=null){
- s.push(h.r);
- }
-
if(h.l!=null){
- s.push(h.l);
- }
- }
- }
-
voidtraverseQ(){
- traverseQ(root);
- }
private void traverseQ(Node h){
NodeQueue q = new NodeQueue(max);
q.push(h);
while(!q.empty()){
h = q.get();
h.item.visit();
if(h.r != null){
s.push(h.r);
}
if(h.l != null){
s.push(h.l);
}
}
}
void traverseQ(){
traverseQ(root);
}
用前序、后序和层序对于森林遍历的定义是明确的。
分享到:
相关推荐
java多叉树的实现:节点集合生成多叉树,单个节点添加到多叉树,深度遍历,广度遍历
迭代树遍历 树遍历算法的迭代实现
java算法二叉树遍历源码文档
java图遍历应用一例: 题目:用1、2、2、3、4、5这六个数字,用java写一个函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
这段代码运用Java实现了二叉树算法的核心功能,包括节点的插入和三种基本的遍历方式——中序、前序和后序。通过创建节点类和二叉树类,它构建了一个灵活且可扩展的二叉树结构,为后续的复杂操作提供了坚实的基础。
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
算法-单链表遍历及反转(java)(csdn)————程序
快速多线程磁盘遍历。优化遍历算法,快速遍历,包括隐藏文件和系统文件在内的全部文件
今天小编就为大家分享一篇关于Java基于深度优先遍历的随机迷宫生成算法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了Java递归算法遍历部门代码示例,具有一定借鉴价值,需要的朋友可以参考下。
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
6 5 广度优先遍历:广度优先算法 70 6 6 连通分量 71 6 7 双连通分量 74 6 8 拓扑排序 77 6 9 强连通分量 79 6 10 可满足性 84 第 7 章 图中的环 86 7 1 欧拉路径 86 7 2 中国邮差问题 88 7 3 最小长度上的比率权重...
《labuladong算法小抄》压缩整理-第零章:框架结构之数据结构 一、存储方式 1、根本存储方式:数组(顺序存储)、链表(链式存储) 2、【队列】、【栈】 3、【图】 4、【散列表】:用散列函数把键映射到一个大数组 5...
树的遍历前序后序递归算法、层序非递归算法。 包括树的建立,树的前序后序递归算法,层序非递归算法。 利用双亲表示法的存储结构。
Java实现遍历、排序、查找算法及简要说明
树的遍历前序后序递归算法、层序非递归算法。 包括树的建立、树的前序后序递归算法、层序非递归算法。 利用二叉链表存储结构创建。
除此之外,Java对于数据集合的遍历,也提供了几种不同的方式。开发人员必须要清楚的明白每一种遍历方式的特点、适用场合、以及在不同底层实现上的表现。下面就详细分析一下这一块内容。 数据元素是怎样在内存中存放...
图的遍历:深度优先、广度优先(A) 最小生成树算法(两个)及其特点(A) 拓扑排序(A) 关键路径算法(A) 最短路径算法(两个)(A,O :时间复杂度) 8. 查找表 查找的有关概念,ASL等 顺序查找(A,P) 熟练...
该资源为迷宫随机生成程序,用Eclipse平台开发的,采用了深度优先遍历算法。迷宫行数列数在界面输入;入口为定点(左上角);有两个出口,在右边界和下边界随机选择。