多叉树的遍历

前段时间面试遇到多叉树遍历的问题,当时想了很久,下午看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;
	}
}

猜你喜欢

转载自4876391520.iteye.com/blog/2297819