我试着建造一棵简单的树:
--宇宙--超星系团
我想出了一个简单的方法,它递归地遍历一棵树:
/**
* 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);
}
}有更好的方法还是更优雅的方法来做到这一点?
发布于 2014-09-17 05:28:17
您正在以深度优先的方式访问和打印树元素,因此depthFirstPrint将是一个比“递归”(对于任何递归函数都是一个糟糕的名称)更好的名称。
你不需要这个演员:
TreeViewItem项目= (TreeViewItem) itr.next();
因为您正确地将迭代器声明为Iterator<TreeViewItem> itr。
在Java1.5中,您可以使用一个for-each循环,它简单而优雅:
for (TreeViewItem item : treeNode.getItems()) {
depthFirstPrint(item);
}发布于 2014-09-17 06:04:45
递归二叉树遍历有三种:先序、有序和后序.您已经实现了预顺序遍历,因此我建议命名您的函数preOrderTraversal()。
您的函数实际上做了两件事:遍历树和打印每个节点。最好将它们分开,这样您就有了一个通用的树遍历算法,并有一个单独的位置来指定在遇到每个节点时应该做什么。使用Java 7,可以使用访客模式来完成这一任务。在Java 8中,访问者模式可能要简单得多,因为该语言允许很容易地传递函数:
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中是否还有值得迭代的内容。
https://codereview.stackexchange.com/questions/63105
复制相似问题