首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >建立一个简单的树结构

建立一个简单的树结构
EN

Code Review用户
提问于 2014-09-17 03:56:25
回答 2查看 1.8K关注 0票数 4

我试着建造一棵简单的树:

--宇宙--超星系团

我想出了一个简单的方法,它递归地遍历一棵树:

代码语言:javascript
复制
/**
 * recursively walk a tree structure
 */ 
public static void recursive(TreeViewItem treeNode){

        System.out.println(treeNode.getText());

        Iterator<TreeViewItem> itr = treeNode.getItems().iterator();

        while (itr.hasNext()) {
            TreeViewItem item = (TreeViewItem) itr.next();
            recursive(item);
        }
}

有更好的方法还是更优雅的方法来做到这一点?

EN

回答 2

Code Review用户

回答已采纳

发布于 2014-09-17 05:28:17

您正在以深度优先的方式访问和打印树元素,因此depthFirstPrint将是一个比“递归”(对于任何递归函数都是一个糟糕的名称)更好的名称。

你不需要这个演员:

TreeViewItem项目= (TreeViewItem) itr.next();

因为您正确地将迭代器声明为Iterator<TreeViewItem> itr

在Java1.5中,您可以使用一个for-each循环,它简单而优雅:

代码语言:javascript
复制
for (TreeViewItem item : treeNode.getItems()) {
    depthFirstPrint(item);
}
票数 10
EN

Code Review用户

发布于 2014-09-17 06:04:45

递归二叉树遍历有三种:先序、有序和后序.您已经实现了预顺序遍历,因此我建议命名您的函数preOrderTraversal()

您的函数实际上做了两件事:遍历树和打印每个节点。最好将它们分开,这样您就有了一个通用的树遍历算法,并有一个单独的位置来指定在遇到每个节点时应该做什么。使用Java 7,可以使用访客模式来完成这一任务。在Java 8中,访问者模式可能要简单得多,因为该语言允许很容易地传递函数:

代码语言:javascript
复制
import java.util.function.Consumer;

…

public static void preOrderTraversal(TreeViewItem treeNode, Consumer<TreeViewItem> action) {
    action.accept(treeNode);
    for (TreeViewItem child : treeNode.getItems()) {
        preOrderTraversal(child, action);
    }
}

// Call that code with
preOrderTraversal(rootNode, (TreeViewItem node) -> System.out.println(node.getText()));

您的TreeViewItem类可以有一个public Iterator<TreeViewItem> iterator()方法,因此TreeViewItem实现了直接迭代子类的Iterable<TreeViewItem>,而不必调用.getItems()。是否要进行此更改取决于除了子节点之外,TreeViewItem中是否还有值得迭代的内容。

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档