java队列遍历多叉树_遍历多叉树

这篇博客探讨了如何使用Java非递归方式遍历多叉树,包括广度优先和深度优先两种方法。递归遍历可能导致栈溢出,因此介绍了使用队列实现的广度优先遍历(BFS)和栈实现的深度优先遍历(DFS)。通过示例代码展示了具体实现,并给出了不同遍历方式的输出结果。
摘要由CSDN通过智能技术生成

dee8284b2dc4

随便画一个树,写代码遍历它

OK,树的结构这么描述

public class TreeNode {

private String name;

private TreeNode parent;

private List children = new ArrayList<>();

//setter,getter

}

递归

public static void Recursion(TreeNode root) {

System.out.print(root.getName());

for (TreeNode treeNode : root.getChildren()) {

Recursion(treeNode);

}

}

//结果为:ABEHIJFCDG

但如果这个树的非常复杂,非常深,该怎么办?

递归这种方式有什么缺点?

先从jvm的栈讲起,先来一张栈帧的结构图

dee8284b2dc4

每当启动一个新线程的时候,java虚拟机都会为它分配一个java栈。java以栈帧为单位保存线程的运行状态。虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈。

通俗点说,每个方法就是一个栈帧,方法要执行就得压栈,return或者抛异常了就出栈.

递归就会在当前线程的栈中不断的入栈,入的多了就爆了,就会抛出java.lang.StackOverflowError

另外,对于一个方法,内存调用是这样的

dee8284b2dc4

刚才在栈帧中的局部变量,如果是对象就会是一个引用,ref只有4byte,但对象本身会在堆(heap)中创建,递归执行完了,出栈了,栈不用管了,但堆里面的对象就得等GC了.

这么一说,递归还真不好用呢,所以非递归方式怎么写呢?

遍历有两种方式,广度优先和深度优先

广度优先

/**

* 广度优先需要构建一个先进先出的队列

*

* @param root

*/

public static void breadthFirst(TreeNode root) {

Deque nodeDeque = new LinkedList<>();

TreeNode node = root;

nodeDeque.push(node);

while (!nodeDeque.isEmpty()) {

node = nodeDeque.pop();

System.out.print(node.getName());

for (TreeNode treeNode : node.getChildren()) {

nodeDeque.addLast(treeNode);

}

}

}

//结果为ABCDEFGHIJ

深度优先

/**

* 深度优先需要构建一个后进先出的栈,

* 不使用Stack是因为java的Stack功能略多

*

* @param root

*/

public static void depthFirst(TreeNode root) {

Deque nodeDeque = new LinkedList<>();

TreeNode node = root;

nodeDeque.push(node);

while (!nodeDeque.isEmpty()) {

node = nodeDeque.pop();

System.out.print(node.getName());

for (TreeNode treeNode : node.getChildren()) {

nodeDeque.push(treeNode);

}

}

}

//结果为ADGCBFEJIH

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值