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

如何合并树在一起,其中一棵树的根等于另一棵树的根?

葛晔
2023-03-14

我目前正在尝试实现一个树(不是二进制的,顺序不重要,不是定向的)数据结构。当一棵树的根与另一棵树的子节点相同时,我希望将树合并在一起
第一棵树的子树应该成为第二棵树的子树,第二棵树的子树与第一棵树的根相同。要合并的树可能更深。

我实现了树节点。java像这样:

public class TreeNode {
    private TreeNode parent;
    private List<TreeNode> children;
    private IP vertexName;
    private int height;
    
    //This creates the root vertex, of the Tree.
    public TreeNode(IP vertexName) {
        this.vertexName = vertexName;
        this.parent = null;
        this.height = 0;
        this.children = new ArrayList<>();
    }
    
    //This is for creating other members of a tree besides the root, the children vertices.
    public TreeNode(TreeNode parentTreeNode, IP vertexName) {
        this.children = new ArrayList<>();
        this.parent = parentTreeNode;
        this.height = (parentTreeNode.getHeight() + 1);
        this.vertexName = vertexName;
        parentTreeNode.children.add(this);
    }


    public void addChildren(List<IP> verteciesIPs) throws NotATreeException {
        areValidChildren(verteciesIPs);

        for (IP ip:verteciesIPs) {
            TreeNode treeNode = new TreeNode(ip);
            treeNode.setParent(this);
            treeNode.setHeight(this.getHeight() + 1);
            this.children.add(treeNode);
        }
    }

    public void addChild(TreeNode treeNodeChildren) {
        treeNodeChildren.setParent(this);
        treeNodeChildren.setHeight(this.getHeight() + 1);
        this.children.add(treeNodeChildren);
    }

    public void areValidChildren(final List<IP> verteciesIPs) throws NotATreeException {
        if (hasDuplicateChildren(verteciesIPs)) {
            throw new NotATreeException("Duplicate entries");
        }

然后我有一个树列表list

我希望有人能帮我。

为了简化起见,我没有发布整个代码。

我尝试迭代List


共有1个答案

步弘和
2023-03-14
匿名用户

您可以实现一个函数来检查树是否包含()给定的数字,然后您可以在每次要添加新值时调用该函数。代码>继续也可以添加数字作为要添加的节点的子节点。您可以尝试查看DFS或BFS,因为您的树更像一个图形而不是实际的树。

 类似资料:
  • 假设给定一组树ST,每棵树的每个顶点都被标记。另外还给出了另一棵树T(也有顶点标签)。问题是如何找到ST的哪些树可以从T的根开始跨越树T,从而使生成树T的顶点标签与T的顶点标签一致。请注意,T的每个顶点的子节点要么完全覆盖,要么根本不覆盖——不允许部分覆盖子节点。换句话说:给定一棵树和以下过程:选择一个顶点,删除该顶点以下的所有顶点和边(除了顶点本身)。找到ST的那些树,这样每棵树都是用一系列应用

  • 我有一个很严重的问题,就是在一棵树中重复搜索子树。 我试过了,但是。。。 似乎没有正确的形式。containsTree函数在找到与另一个节点不同的节点时停止搜索。 下面是两棵树的例子。 在这种情况下,当函数比较右边的子树和左边的子树时,当find等于父节点但它有不同的子节点时,它会停止搜索。我需要函数不要停止搜索,而是抛出这一点,搜索所有其他子节点及其子树。

  • 我必须使用绘制一个可呈现的树。你可以在图片中看到 应满足此链接中陈述的所有原则。 原则是: 原则1:树的边不应该互相交叉。 原则2:相同深度的所有节点应绘制在同一水平线上。这有助于清除树的结构。 原则3:树木的绘制应尽可能窄。 原则4:父母应以子女为中心。 原则5:子树无论位于树中的哪个位置,都应以相同的方式绘制。 原则 6:父节点的子节点应均匀分布。 如何计算每个节点的X、Y位置?

  • 我正在尝试打印一棵树,问题是我找不到任何其他方法,只能像这样打印它: 但有没有办法像这样打印它: 这是我的代码: 在这里,我为树节点创建了一个类,我知道代码很糟糕,但我仍然是初学者,我将在未来改进它。我使用列表来存储子列表和链表来对兄弟姐妹进行排序,因为它稍后在尝试打印实际树时会很有用。 我打印树的方式是这样的:打印当前节点,如果当前节点有任何子节点,则转到子节点,如果没有,则转到当前节点的父节点

  • 假设我在一棵树中有一个节点,我如何获得所有的叶节点,它们的祖先是这个节点?我这样定义了TreeNode:

  • 我正在努力想出一种算法,它允许我绘制一个像数据结构一样的树,其中每个节点可以有0..n个子节点。对我来说,问题是,我不知道我必须放置节点多远,以便子节点不会重叠。 在本例中,“d”是“b”的子级,“g”是“e”的子,当我在给定树的总宽度的情况下,将子级均匀分布在其父级上方时,它们在x轴上重叠。 节点不以任何方式排序。所以它实际上更像一个必须看起来像树的图。