zoukankan      html  css  js  c++  java
  • 一种简洁的非递归遍历树的常用算法

    树形结构是常用的数据结构,要遍历他一般使用递归算法。递归的好处是代码简洁;坏处是效率低,容易堆栈溢出。

    要实现非递归遍历树,我们使用栈结构,基本实现思路是:从根开始逐层遍历。

    思路:

    1)将根节点压栈

    2)循环检查栈是否为空

      (1)如果为空,循环结束(遍历也结束了)

      (2)如果不为空,出栈一个节点

    3) 检查该节点是否是要找的节点

      (1)如果是,退出循环,遍历结束

      (2)如果不是,将该元素的下一层节点全部压栈。

    4)继续执行2)

    伪代码:

    Stack<Node> stack=new Stack<Node>();
    stack.push(root);
    while(!stack.isEmpty())
    {
    Node n=stack.pop();
    if(isMyNode(node))
    {
    //找到了
    break;
    }
    else
    {
    for(int i=0;i<n.Children;i++)
    {
    stack.push(n.Children[i]);
    }
    }
    }

    整个代码还算简洁:两个循环,一个栈结构搞定。其中循环的结束条件是关键:栈是否为空!

    感悟:

    现代语言的抽象能力只能到while循环层次,循环就是机器层面的最高级形式了,距离人的语言也太远了吧。

    这也是算法的意义——在机器和人之间架起一座桥梁。

    难道人的思维经过底层分解后也是这种简单的形式?

  • 相关阅读:
    MySQL 正则表达式
    spark 应用场景2-身高统计
    spark 应用场景1-求年龄平均值
    spark jdk8 单词统计示例
    spark 常用函数介绍(python)
    Spark如何读写hive
    sparkJavaApi逐个详解
    Spark基础与Java Api介绍
    Spark函数详解系列之RDD基本转换
    Spark中使用Java编程的常用方法
  • 原文地址:https://www.cnblogs.com/slmk/p/2366970.html
Copyright © 2011-2022 走看看