如何遍历 N 叉树

2023-12-31

我的树/节点类:

import java.util.ArrayList;
import java.util.List;

public class Node<T> {
   private T data;
   private List<Node<T>> children;
   private Node<T> parent;

   public Node(T data) {
      this.data = data;
      this.children = new ArrayList<Node<T>>();
   }

   public Node(Node<T> node) {
      this.data = (T) node.getData();
      children = new ArrayList<Node<T>>();
   }

   public void addChild(Node<T> child) {
      child.setParent(this);
      children.add(child);
   }

   public T getData() {
      return this.data;
   }

   public void setData(T data) {
      this.data = data;
   }

   public Node<T> getParent() {
      return this.parent;
   }

   public void setParent(Node<T> parent) {
      this.parent = parent;
   }

   public List<Node<T>> getChildren() {
      return this.children;
   }
}

我知道如何遍历二叉树,但遍历 N 叉树似乎更棘手。

我该如何穿越这棵树?我需要一个计数器,同时遍历树来对树中的每个节点进行编号/计数。

然后,在特定的计数处,我可以停止并返回该计数处的节点(也许删除该子树或在该位置添加子树)。


最简单的方法是实现这样的访问者模式:

public interface Visitor<T> {
    // returns true if visiting should be cancelled at this point
    boolean accept(Node<T> node);
}

public class Node<T> {
    ...

   // returns true if visiting was cancelled
   public boolean visit(Visitor<T> visitor) {
       if(visitor.accept(this))
           return true;
       for(Node<T> child : children) {
           if(child.visit(visitor))
               return true;
       }
       return false;
   }
}

现在你可以像这样使用它:

treeRoot.visit(new Visitor<Type>() {
    public boolean accept(Node<Type> node) {
        System.out.println("Visiting node "+node);
        return false;
    }
});

或者对于您的特定任务:

class CountVisitor<T> implements Visitor<T> {
    int limit;
    Node<T> node;

    public CountVisitor(int limit) {
        this.limit = limit;
    }

    public boolean accept(Node<T> node) {
        if(--limit == 0) {
            this.node = node;
            return true;
        }
        return false;
    }

    public Node<T> getNode() {
        return node;
    }
}

CountVisitor<T> visitor = new CountVisitor<>(10);
if(treeRoot.visit(visitor)) {
    System.out.println("Node#10 is "+visitor.getNode());
} else {
    System.out.println("Tree has less than 10 nodes");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何遍历 N 叉树 的相关文章

  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 查找最接近点的多边形顶点的索引

    Heading 我需要找到最接近点的多边形的索引 所以在这种情况下 输出将是 4 和 0 这样 如果添加了红点 我就知 道将顶点放置在数组中的位置 有谁知道从哪里开始 抱歉 如果标题有误导性 我不知道如何正确表达它 In this case
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 对嵌套关注点的循环依赖

    有人知道为什么在我的生产服务器上我不能在模型中使用嵌套关注点吗 我有一个模型Landing class Landing lt ActiveRecord Base include Claimable end 和关心 module Claima
  • 结合 Aero Glass 效果和 SWT

    作为一个宠物项目 我一直在尝试将 Aero Glass 效果集成到我的 SWT 应用程序中的概念 ukasz Milewski 有一篇很棒的博客文章 http www milewski ws 2009 02 vista glass in s
  • 用 C++ 编写的语法和语义代码完成框架

    这个问题比我之前的问题更精确 用 C C 编写的通用代码补全框架 https stackoverflow com questions 13595747 general code completion framework written in
  • CLang 错误(目标 C):初始化期间存储的值永远不会被读取

    Foo oFoo Foo alloc init autorelease 这就是我被教导用 Objective C 编程的方式 但 CLang 错误检查器抱怨从未读取初始值 但 oFoo 是一个具有属性的对象 oFoo 本身没有单一值 财产价
  • Oracle:max(id)+1和sequence.nextval之间的区别

    我正在使用甲骨文 我们创建时有什么不同ID using max id 1并使用sequance nexval 在哪里使用以及何时使用 Like insert into student id name values select max id
  • 在 Typoscript HMENU 中,如何强制 URL 的语言

    我有一个多语言 多站点 多域 TYPO3 4 5 实例 RealURL 让我很忙 在某些子站点中 我无法让它为语言 1 和 2 创建正确的 URL 它将导致模式 www language 2 domain com language 1 pa
  • 测试Lua数字是整数还是浮点数

    在我的C 程序中 我需要知道Lua变量是整数还是浮点数 C API 提供lua isnumber 但这个函数不区分int float double 到目前为止 我已经通过使用解决了这个问题modf if lua isnumber luaCt
  • 直接访问 php superglobal 时的安全问题

    我刚刚将我的 IDE Netbean 升级到 1 7 4 beta 以对其进行测试 现在看来 每当我访问我的超全局变量时 它都会向我发出警告 它说 不要直接访问超级 POST数组 我目前只是使用这个 taxAmount intval cei
  • 赔率和偶数应用

    我正在生成 25 个 0 到 99 之间的随机整数 但是我必须 在一行上显示所有偶数 在下一行显示所有赔率 我该怎么做 public class FindEvenOrOddNumber public static void main Str
  • 在加载 HTML 表格中的每一行时添加延迟

    我正在从 Jquery 动态加载 HTML 表的数据 document ready function for var i 0 i lt StudentsList length i LoadRow StudentsList i functio
  • 路径路由:React 应用程序的应用程序负载均衡器

    我正在尝试在 AWS 应用程序负载均衡器中创建路径路由 Example apple mango com vault去instance1端口 80 和 nginx 将其路由到 var html reactApp1 build apple ma
  • 在基于 django 类的通用视图 CreateView 中设置表单字段

    我正在使用 django 的CreateView将图像添加到书中 我将书的 id 作为 url 中的参数传递给基于类的视图 表单字段 例如book and language不会在模板上呈现 而是通过书籍 ID 获得 views py cla
  • 设置默认 WebAPI 格式化程序

    我们使用 WebAPI 来模拟遗留系统的处理 因此 我们希望默认响应格式化程序是 XmlFormatter 而不是 JsonFormatter 原因是某些现有的服务调用不提供 Accept HTTP 标头字段 我可以通过从 Formatte
  • RTSP/RTMP 视频流客户端 iOS [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个开源解决方案 库来将 RTSP RTMP 流式传输到 iOS 应用程序 我需要构建一个连接到媒
  • ipywidgets 小部件值未更改

    我正在尝试从在 Python 3 6 中运行 Jupyter Notebooks 的 Microsoft Azure Notebooks 中的 ipywidgets 小部件获取输出 但是 当我获取新值时 它不会返回新值 这也适用于从未被其他
  • PhoneGap IOS 应用程序大小

    我使用 eclipse 和 xcode 4 5 创建了适用于 android 和 IOS 的phonegap 应用程序 Android应用程序大小为650KB iOS应用程序的大小是9MB 我创建了空的phonegap应用程序 刚刚在终端上
  • 位运算与

    这是一个leetcode问题 给定一个数字数组 nums 其中恰好有两个元素仅出现一次 而所有其他元素恰好出现两次 找出只出现一次的两个元素 例如 给定 nums 1 2 1 3 2 5 返回 3 5 我的代码是 class Solutio
  • 使用bash,如何删除特定目录中所有文件的扩展名?

    我想保留这些文件但删除它们的扩展名 这些文件的扩展名不同 我的最终目标是删除它们的所有扩展并将它们更改为我选择的一个扩展 我已经把第二部分写下来了 到目前为止我的代码 bin bash echo n Enter the directory
  • 寻找在过程中保持大小并清除旧元素的数据结构

    Usecase维护最后 n 个访问过的 URL 的列表 其中 n 是固定数字 当新的 URL 添加到列表中时 旧的 URL 会自动删除 以使其保持在 n 个元素 要求数据结构需要按时间排序 如果接受 Comparator 应该没问题 你需要
  • 如何遍历 N 叉树

    我的树 节点类 import java util ArrayList import java util List public class Node