当前位置: 首页 > 知识库问答 >
问题:

找到树中节点的路径?

傅啸
2023-03-14

我有一个树类,看起来像:

Class Tree {
   Node root;
   Node curNode;
   public List<String> find(String value) {
      if (curNode == null) curNode = root;
        for (Node child : curNode.children) {
            if (found == false) {
                if (child.data.equals(value)) {
                    // if it finds it return the path to this node.
                }
                curNode = child;
                findDFS(value);
            }
        }
   }


class Node {
   List<Node> children;
   String data;
}

其中树根包含指向其他子节点等的子节点的指针。我遇到的问题是,一旦它找到节点,我需要返回到该节点的路径。

共有3个答案

曾航
2023-03-14

下面的代码跟踪路径,将节点添加到列表中,如果不在路径中,则将其删除

boolean getPath(Node root,String targetValue,List<Integer> path)
{
    // base case root is null so path not available
    if(root==null)
        return false;
    //add the data to the path
    path.add(root.getData());
    //if the root has data return true,path already saved
    if(root.getData().equals(targetValue))
        return true;
    //find the value in all the children
    for(Node child: children){
         if(getPath(child,targetValue,path))
          return true;
    }
    //if this node does not exist in path remove it
    path.remove(path.size()-1);
    return false;
}
轩辕鸿
2023-03-14

如果节点只指向它们的子节点,则需要在向下的过程中跟踪每条路径。正如在注释中提到的,您可以使用自己的堆栈或递归来实现这一点。例如,您可以始终对每个节点的子节点返回find()调用

如果节点指向两个方向,则在找到正确的节点后,可以轻松地重新跟踪路径。

公西俊民
2023-03-14

传递跟踪路径的列表,找到节点后,退出递归并逐个填充路径。

    Boolean Search(Node node, String value, List<Node> track)
    {
        if (node == null) return false;

        if (node.data.equals(value))
        {
            track.add(node);
            return true;
        }

        for(Node child : node.children)
        {
            if (Search(child, value, track)
            {
                track.add(0, node);
                return true;
            }
        }

        return false;
    }
 类似资料:
  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 我现在正在读一本关于从二叉搜索树中删除节点的书,书中描述的过程对我来说似乎不必要地复杂。 在1号情况下,如果我们删除40,它将替换为30;在 2 号情况下,如果我们删除 40,它将被替换 35。 但在书中,它说应该从要删除的节点的右子树中找到替换,这可能涉及一些复杂的操作。 我在这里遗漏了什么吗?请指出。

  • 那么,如何打印树中的所有路径呢。这里的条件是,我们不仅需要从根开始的路径或子树中的路径。 例如: 因此程序应该返回: 一种方法是在每个不同的节点对之间找到LCA,然后打印从LCA到两个节点的路径(在左子树中反转,在右子树中按顺序排列)。但是这里的复杂性是O(n3)。有更有效的解决方案吗?

  • 我正在做一项作业,它要求我输入并显示一个家谱,首先将它转换成一个二叉树--孩子在左边,兄弟在右边。我了解树,遍历树,以及如何使用pre-,in-,和post-order方法搜索某些节点。 我已经编写了代码来插入一个新节点,查找一个节点,并打印整个树,但是我的findNode方法不能正常工作。我需要它使用预购搜索树,并返回它正在寻找的节点。目前,递归方法使它一直到左下角(最小的子节点)和最小的子节点

  • 主要内容:src/runoob/binary/BinarySearchTreeSearch.java 文件代码:二分搜索树没有下标, 所以针对二分搜索树的查找操作, 这里定义一个 contain 方法, 判断二分搜索树是否包含某个元素, 返回一个布尔型变量, 这个查找的操作一样是一个递归的过程, 具体代码实现如下: ... // 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法 private boolean contain (Node node, Key key )

  • 我试图通过在MST中添加新顶点来更新MST。为此,我一直在关注Chin和Houck的“更新生成树”。http://www.computingscience.nl/docs/vakken/al/WerkC/UpdatingSpanningTrees.pdf 论文中的一个步骤要求我在两个给定顶点之间的路径中找到最大的边。我的想法是找到顶点之间所有可能的路径,然后从这些路径中找到最大的边。我一直在尝试在