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

Java中的树实现

扶杜吟
2023-03-14

我得到了以下树:

然后我们被告知使用最后一个孩子/前一个兄弟姐妹方法来改变这三者的实现。这导致了以下结果:

我现在正在用Java实现来执行这棵树上的不同功能。我们有一个树接口和一个TreeNode接口。他们都有许多我们需要填写的功能。

节点是这样创建的:

MyTreeNode a = new MyTreeNode ("a");

树是这样创建的(使用根):

MyTree     tree = new MyTree (a);

最后,节点被赋予兄弟姐妹子级,如下所示:

e.setChild(j);
e.setSibling(d);

我已经为setChild、setSibling、getNextSibling和getFirstChild编写了方法。例如,这是getChildren的代码:

public List getChildren ()
{
    List <MyTreeNode> children = new ArrayList <MyTreeNode> ();

    MyTreeNode x = this.child;

    children.add(x);

    while (x != null && x.sibling != null) {
        x = x.sibling;
        children.add(x);
    }

    return children;
}

我现在完全不知道如何编写节点子树的高度、深度、大小、getPreorder、getPostorder和树大小的方法。

由于树现在处于这种不同的表示形式中,我不确定如何编写递归方法来检查节点的高度或深度。通常,据我所知,您会递归地检查左/右子树...但是现在没有任何(就我所知)。我能想到的唯一方法是使用许多if语句和while循环遍历每个节点...但这不是最好的方法。

我如何用这种树的实现递归地编写这些方法?

此外,我不知道如何获得关于整个树的详细信息,因为节点没有以任何方式存储在一起。它们是以我上面展示的方式实现的,所以我不知道如何集体收集所有节点的数据

如何在整个树的所有节点上创建树大小、isEmpty或MakeMpty等方法?

抱歉,解释太冗长了。

共有1个答案

强阳曜
2023-03-14

假设您的树有一个这样的节点结构:

public class Node{
   String nodeName;

   Node left;
   Node right;

   public Node(String nodeName, Node left, Node right){
     this.nodeName = nodeName;
     this.left     = left;
     this.right= right;
   }
}

以下是我对如何构建你的新树的想法:当你向你的树添加新节点时,你将仍然保持你的树结构。根据您将节点添加到树中的方式,您仍将继续添加到父节点的左侧或右侧。

可视化新树的一种可能方法是这样的:

                A
               /
              E
            /   \
           D     J
         /   \   / \
        C    H  I   K
       /
      B
     /
    G
   /    
  F

注意:我在这里假设,如果是一个孩子,它会被添加到你父母的左边。但这最好取决于你的要求

如果您可以以这种方式可视化此树,则用于获取高度、前序、后序遍历的递归函数仍然保持不变。

还有几个提示:

>

  • 添加同级节点类似于在节点父节点的左侧或右侧添加节点,即如果当前节点位于其父节点的右侧,则将在右侧添加新节点。

    添加子项将保持不变。根据您的逻辑,您可以将新节点添加为当前节点的左子节点或右子节点。

  •  类似资料:
    • 我正在尝试用java实现二叉树,下面是我的代码: 我无法在我的树中插入新节点,root的值不会改变 当我调用newnode函数时,我得到了我的Root Node的正确值,但在main函数中,它给了我空点异常 为什么root的值没有更新

    • 本文向大家介绍Trie树(字典树)的介绍及Java实现,包括了Trie树(字典树)的介绍及Java实现的使用技巧和注意事项,需要的朋友参考一下 简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。 它的主

    • 本文向大家介绍Java中二叉树数据结构的实现示例,包括了Java中二叉树数据结构的实现示例的使用技巧和注意事项,需要的朋友参考一下 来看一个具体的习题实践: 题目 根据二叉树前序遍历序列例如:7,-7,8,#,#,-3,6,#,9,#,#,#,-5,#,#,构建二叉树,并且用前序、中序、后序进行遍历 代码 二叉树的深度 下面是是实现二叉树的递归算法的实现,其思想就是,若为空,则其深度为0,否则,其

    • 问题内容: 我正在编写一个使用二进制搜索树存储数据的程序。在以前的程序中(无关),我能够使用Java SE6随附的实现来实现链表。二进制搜索树是否有类似的东西,还是我需要“从头开始”? 问题答案: 您可以使用。被实现为一棵红黑树,这是一个自平衡二进制搜索树。

    • 我有一个表示二叉树节点的树节点的树节点。 } 我有一个BinarySearchTree类 问题是当我创建一个子节点并设置父子链接时。父节点的值(我传递的节点对象)也会更新并引用子对象。 那不是我的本意。 我想创建一个treenode对象链,可以通过“根”treenode对象访问它。 但这并没有发生,我不明白我做错了什么。 我知道问题出在这个代码片段的逻辑上(不仅仅是为了在左边插入,也是为了在左边和