美文网首页
遍历多叉树

遍历多叉树

作者: beg4 | 来源:发表于2018-03-22 15:14 被阅读0次

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

OK,树的结构这么描述

public class TreeNode {
        private String name;
        private TreeNode parent;
        private List<TreeNode> 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的栈讲起,先来一张栈帧的结构图

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

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

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

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


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

这么一说,递归还真不好用呢,所以非递归方式怎么写呢?
遍历有两种方式,广度优先和深度优先

广度优先

/**
 * 广度优先需要构建一个先进先出的队列
 *
 * @param root
 */
public static void breadthFirst(TreeNode root) {
    Deque<TreeNode> 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<TreeNode> 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

相关文章

  • js二叉树(前中后序遍历)+多叉树(深度优先遍历和广度优先遍历)

    ?二叉树三种遍历 和 多叉树 深度优先遍历和广度优先遍历 二叉树遍历 先序遍历(根左右) 中序遍历(左根右) 后序...

  • 树的遍历

    N叉树的遍历 N叉树的前序遍历 N叉树的后序遍历 N叉树的层序遍历 二叉树 鉴于递归法遍历比较简单,就不重复写了 ...

  • 遍历多叉树

    随便画一个树,写代码遍历它 OK,树的结构这么描述 递归 但如果这个树的非常复杂,非常深,该怎么办? 递归这种方式...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 2019 算法面试相关(leetcode)--树、二叉树、二叉搜

    翻转二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历验证二叉搜索树二叉树的最近公共祖先二叉搜索树的最近公共祖...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 树,二叉树,搜索树

    树,二叉树,搜索树 资料 二叉搜索树 Demo 树的遍历 Demo 题目 ◎ 二叉树的中序遍历 ◎ 二叉树...

网友评论

      本文标题:遍历多叉树

      本文链接:https://www.haomeiwen.com/subject/frpaqftx.html