我有一个二叉树,每个节点都有一个单词。
在另一个类中,我需要逐个访问节点,然后操纵这些单词。从另一个类逐个访问节点的最佳方法是什么?
在我的BinaryTree类中,每个节点都有一个左子节点,右侧节点和一个值(String)。我有三个方法,printinorder,insert和findnode。 find节点接受一个字符串,并查看该字符串是否存储在任何节点值中。
public void printInOrder(Node node) {
if (node != null) {
printInOrder(node.left);
System.out.println(node.value);
printInOrder(node.right);
}
我有另一个类,需要一个接一个地进入节点,但我不确定从另一个类做到最好的方法。我能够从课堂内遍历树,但不能从不同的课程中遍历。
答案 0 :(得分:1)
遍历二叉树中所有节点的一种方法是执行以下操作:启动最左边的节点并重复迁移到当前节点的 inorder successor :
首先走到尽可能远的地方,不要从树上掉下来。这是您的第一个节点。
要从一个节点进入下一个应该访问的节点,请执行以下操作:
这最终只能在所有节点上花费O(n)时间,因此在节点之间进行迁移是一种非常快速的方式。
为了使其工作,您需要让每个节点存储父指针,或者必须维护从起始节点向下到当前节点的节点路径的堆栈。但是,对于合理平衡的树,这比填充树中的整个节点列表并返回它更节省空间。
希望这有帮助!
答案 1 :(得分:0)
假设你有一个树类,首先写一个遍历树的方法(广度/深度搜索)。在遍历中的每个节点处,假设您的节点是某种类型的对象,在其中一个变量中保存一个单词,请访问该节点并更改存储的单词。基本上在Binary Tree类中编写函数可以执行此操作,并在其他类中调用它们。
答案 2 :(得分:0)
搜索:
您可以将树排序为二叉搜索树。或者在构建树时,构建二叉搜索树。这将是最好的搜索方式。 O(logn)
。
搜索应在您的findNode(String value)
方法
或者您在实施搜索时遇到问题?
答案 3 :(得分:0)
阅读templatetypedef的答案,这是一种更有效的方法。我提出的方法的优点是它不需要对现有Node类进行任何更改,并使用您已经用于PrintInOrder的相同模式。它只依赖于Node类的公共属性,因此应该可以从单独的类中使用。
public List<Node> nodes GetAllNodes(Node root) {
List<Node> nodes = new ArrayList<Node>();
if (root != null) {
nodes.addAll(GetAllNodes(root.left));
nodes.add(root);
nodes.addAll(GetAllNodes(root.right));
}
return nodes;
}
我没有编译或测试它,因此可能存在错误。