前段时间面试遇到多叉树遍历的问题,当时想了很久,下午看java源码时,看到Path以及File的设计,瞬间想通了其中的关键点。
遍历的关键点不是遍历思想,而是如何去处理某个节点。
这里采用堆存储,也就是先进后出的存储模式,具体代码为每次处理list最后一个节点。
处理方式为:如果该节点不存在子文件夹,打印该节点的所有文件;如果该节点存在子文件夹,删除该节点的最后一个子文件夹后,将该节点重新入堆,然后将子节点入堆。
以下为具体代码:
package workFiles;
import java.util.LinkedList;
/**
* 模拟文件类,包括文件夹和文件
*/
public class File {
private LinkedList<File> folders;
private LinkedList<String> files;
public LinkedList<File> getFolders() {
return folders;
}
public void setFolders(LinkedList<File> folders) {
this.folders = folders;
}
public LinkedList<String> getFiles() {
return files;
}
public void setFiles(LinkedList<String> files) {
this.files = files;
}
}
package workFiles;
import java.util.LinkedList;
public class WalkTree {
public static void main(String[] a){
LinkedList<File> list = new LinkedList<>();
File f = createTree();
list.add(f);
while(list.size()!=0){
readList(list);
}
}
//处理堆
static LinkedList<File> readList(LinkedList<File> list){
//获取栈中最后的节点
File f = list.removeLast();
//如果当前节点存在文件夹
if(f.getFolders()!=null&&f.getFolders().size()!=0){
//去掉当前节点的文件夹
File next = f.getFolders().removeLast();
//重新存入当前节点
list.add(f);
//存入新节点
list.add(next);
}
else{
if(f.getFiles()!=null&&f.getFiles().size()!=0){
for(int i=0;i<f.getFiles().size();i++){
System.out.println(f.getFiles().get(i));
}
}
}
return list;
}
//模拟创建文件夹
static File createTree(){
File A =new File();
File B =new File();
File C =new File();
LinkedList<String> str1 = new LinkedList<String>();
str1.add("A文件1");
A.setFiles(str1);
LinkedList<String> str2 = new LinkedList<String>();
str2.add("B文件1");
str2.add("B文件2");
B.setFiles(str2);
LinkedList<String> str3 = new LinkedList<String>();
str3.add("C文件1");
str3.add("C文件2");
str3.add("C文件3");
C.setFiles(str3);
LinkedList<File> temp = new LinkedList<File>();
temp.add(B);
temp.add(C);
A.setFolders(temp);
return A;
}
}
分享到:
相关推荐
本资料包"基于Python的多叉树遍历算法.zip"主要探讨如何在Python中实现多叉树的遍历算法。下面我们将详细讨论多叉树的概念、遍历方法以及如何用Python来实现这些算法。 一、多叉树的基本概念 多叉树是由节点和边...
三叉树多叉树遍历 c# 2.0
在IT领域,多叉树是一种数据结构,它...总之,多叉树遍历是理解和操作这种数据结构的关键。通过掌握不同类型的遍历方法,我们可以有效地在多种IT场景中利用多叉树解决问题,无论是数据处理、搜索算法还是其他复杂任务。
### 多叉树遍历与结构解析 #### 概述 多叉树作为一种重要的数据结构,在计算机科学领域有着广泛的应用。本文将详细介绍一种基于C++实现的多叉树容器类`tree.hh`,该库由Kasper Peeters开发,并遵循GNU通用公共许可...
本篇文章将深入探讨如何在Java中实现多叉树以及其遍历方法。 首先,我们需要定义一个多叉树节点类。这个类通常包含一个数据字段来存储节点值,以及一个ArrayList或LinkedList等动态数组来存储子节点。以下是一个...
本文实例讲述了JavaScript实现多叉树的递归遍历和非递归遍历算法操作。分享给大家供大家参考,具体如下: 演示之前的准备工作 演示项目的文件结构: index.html jsonData.js recurrenceTree.js noRecurrenceTree.js ...
本文将深入探讨如何使用C++语言分层建立一个多叉树,并进行分层遍历输出。在此过程中,我们将特别关注在奇数节点位置插入偶数节点的策略,以满足特定的输出格式要求。 首先,我们需要理解多叉树的概念。与二叉树...
多叉树的建立以及后序非递归遍历,希望对学习数据结构的同学有所帮助,也对树一部分有更深的了解。
3. **遍历**:类似于二叉树,多叉树也可以进行前序、中序和后序遍历,但定义会稍微复杂些,因为子节点数量不固定。 4. **深度优先搜索(DFS)**和**广度优先搜索(BFS)**:这两种遍历方法同样适用于多叉树,DFS沿着...
多叉树是树结构的一种变体,每个节点可以有多个子节点,区别于二叉树(每个节点最多两个子节点)。在数据库中存储树状数据时,我们需要考虑如何有效地表示和操作这种结构。本文将围绕"树状数据(多叉树)在数据库中...
首先将根节点入队列,然后检测队列是否为空,如果不为空,将队列出队列,访问出队列的节点,然后将该节点的子节点指针入队列,依次循环下去,直至队列为空,终止循环,从而完成整个多叉树的层次优先遍历。
1. 前序遍历:这是树遍历的一种常见方法,先访问根节点,然后遍历左子树,最后遍历右子树。在多叉树中,这个顺序变为访问根节点,然后遍历所有子节点。前序迭代器会按照这个顺序提供节点。 2. 后序遍历:后序遍历的...
3. **遍历多叉树**:实现深度优先搜索(DFS)或广度优先搜索(BFS)来访问树的所有节点。DFS可以使用递归或栈来实现,BFS则通常使用队列。 4. **查找节点**:根据给定的数据值查找特定的节点。 5. **删除节点**:...
4. 遍历多叉树:多叉树的遍历可以分为深度优先遍历(DF)和广度优先遍历(BF)。深度优先遍历是从根节点开始,尽可能沿着树的深度遍历节点,而广度优先遍历则是从根节点开始,逐层从左到右遍历节点。这两种遍历方法...
### 多叉树的实现详解 #### 一、概述 多叉树是一种常见的数据结构,在计算机科学领域有广泛的应用场景,比如在机器学习中的决策树、数据库索引、文件系统等。多叉树与二叉树相比,节点可以拥有两个以上的子节点。...
在"TreeNde 多叉树"这个主题中,我们将深入探讨如何动态生成多叉树、自动化遍历以及生成XML文本的实现方法。 首先,动态生成多叉树是指在程序运行时根据特定需求或数据构建树结构。这通常涉及到递归算法,因为树的...
在C#中实现多叉树的后序遍历,首先需要定义一个树节点类,包含节点值和子节点列表。例如: ```csharp public class TreeNode { public int Value { get; set; } public List<TreeNode> Children { get; set; } ...
可以用来构造不同类型的树,并显示出来,可按非递归的方法进行遍历,遍历分两种方法,广度优先搜索和深度优先搜索。代码中有详细说明。在readme.txt有一些相关介绍。 程序在vc6,vs2005环境下编译通过。
这两种方法都有前序、中序和后序遍历,但对多叉树来说,这些术语的含义可能有所不同,因为没有固定的“左”和“右”。 4. **查找和删除节点**:实现查找特定人员的功能,以及删除某个节点的功能。查找可能涉及DFS或...
层次遍历是多叉树操作中常用的方法,通常包括前序遍历、中序遍历和后序遍历。在图书管理系统中,前序遍历可能先访问书名,然后是作者和出版信息;中序遍历可能按照某种特定的排序规则进行;后序遍历可能用于处理子...