Java 如何在树节点中没有父链接的情况下获取二叉树的根?

Java 如何在树节点中没有父链接的情况下获取二叉树的根?,java,algorithm,binary-tree,Java,Algorithm,Binary Tree,我的任务是做以下工作: 编写、记录(内部)和测试Java程序以解决以下问题: 使用链接表示法实现二叉树ADT,其中每个节点包含以下内容: 资料 左侧子对象的引用/链接 指向正确子对象的引用/链接 假设数据是整数值 执行以下操作(如教科书第7.3节所述): 大小 空空如也 替换 根 左 对 离开 哈斯赖特 内部的 等外部 伊斯鲁特 插入左 插入右键 附加 除去 以及以下遍历: 预购 邮购 有序 我知道二叉树是如何工作的,在大多数情况下,我这样做没有问题——但我的问题是,除了给定的三个变

我的任务是做以下工作:

编写、记录(内部)和测试Java程序以解决以下问题:

使用链接表示法实现二叉树ADT,其中每个节点包含以下内容:

  • 资料
  • 左侧子对象的引用/链接
  • 指向正确子对象的引用/链接
假设数据是整数值

执行以下操作(如教科书第7.3节所述):

  • 大小
  • 空空如也
  • 替换
  • 离开
  • 哈斯赖特
  • 内部的
  • 等外部
  • 伊斯鲁特
  • 插入左
  • 插入右键
  • 附加
  • 除去
以及以下遍历:

  • 预购
  • 邮购
  • 有序

我知道二叉树是如何工作的,在大多数情况下,我这样做没有问题——但我的问题是,除了给定的三个变量之外,节点类中不允许有任何变量——也就是说,我不能创建父链接。如果无法链接到父节点,如何检查给定节点是否为树的根?

您可以定义
BinaryTree
类,并在其中保留
节点
根字段。因此,您已经知道根

您可以定义
二进制树
类,并在其中保留
节点
根字段。因此,您已经知道根

和一个
二叉树
节点有三个属性:

int value; 
Node left;
Node right;
因此,如果我想建一棵树,我可以:

root = Node();
root.value = 5;
root.left = Node();
root.left.value = 3;
root.left.right = Node()
root.left.right.value = 4;
root.right = Node();
root.right.value = 6;
root.left.left = node();
root.left.left.value = 1;
这将给一棵树:

    5
   / \
  3   6
 / \
1   4
现在,我们的
根目录
保存了所有这些信息,我们可以通过它访问附加到它的任何节点

因此,基本上,您需要为所有这些操作编写一个包装器。要检查任意节点是否为根节点,只需将其与存储为根节点的节点进行比较

结构如下:

public class BinaryTree{
    class Node {
        int value;
        Node left;
        Node right;
    }
    Node root;
    //method declarations
}

使用
BinaryTree
可以获得具有三个属性的节点:

int value; 
Node left;
Node right;
因此,如果我想建一棵树,我可以:

root = Node();
root.value = 5;
root.left = Node();
root.left.value = 3;
root.left.right = Node()
root.left.right.value = 4;
root.right = Node();
root.right.value = 6;
root.left.left = node();
root.left.left.value = 1;
这将给一棵树:

    5
   / \
  3   6
 / \
1   4
现在,我们的
根目录
保存了所有这些信息,我们可以通过它访问附加到它的任何节点

因此,基本上,您需要为所有这些操作编写一个包装器。要检查任意节点是否为根节点,只需将其与存储为根节点的节点进行比较

结构如下:

public class BinaryTree{
    class Node {
        int value;
        Node left;
        Node right;
    }
    Node root;
    //method declarations
}

假设您有一个孤立的节点,只知道它是左链接和右链接的节点,而不知道其他任何内容,则无法确定根节点,除非您有一个要测试的节点集合

当然,显而易见的方法是使用周围树结构的根属性,它实际上定义了树,也就是这里介绍的所有其他解决方案

但是,如果出于某种原因,不允许您这样做,您可以执行以下代码测试所有可用节点。作为一个副作用,它还为您提供了“parent”属性的实现

事实上,“根”可以定义为“没有父节点的节点”

public TreeNode Parent(TreeNode node)
{
  TreeNode result = null;
  foreach (TreeNode candidate in allTheNodes)
    if (candidate.left == node || candidate.right == node)
      return candidate;

  return null;
}

public TreeNode root()
{
  foreach (node in allTheNodes)
    if (Parent(node)==null) 
      return node;

  return null;
}

假设您有一个孤立的节点,只知道它是左链接和右链接的节点,而不知道其他任何内容,则无法确定根节点,除非您有一个要测试的节点集合

当然,显而易见的方法是使用周围树结构的根属性,它实际上定义了树,也就是这里介绍的所有其他解决方案

但是,如果出于某种原因,不允许您这样做,您可以执行以下代码测试所有可用节点。作为一个副作用,它还为您提供了“parent”属性的实现

事实上,“根”可以定义为“没有父节点的节点”

public TreeNode Parent(TreeNode node)
{
  TreeNode result = null;
  foreach (TreeNode candidate in allTheNodes)
    if (candidate.left == node || candidate.right == node)
      return candidate;

  return null;
}

public TreeNode root()
{
  foreach (node in allTheNodes)
    if (Parent(node)==null) 
      return node;

  return null;
}

您必须将根的引用存储在某个位置。检查节点N是否为根只是检查N==根。必须将根的引用存储在某个地方。检查节点N是否为根只是检查N==root。但是如何从
BinaryTreeNode
类中引用它呢?这个赋值看起来很难,因为它很难。你可以定义两个类BinaryTree和BinaryTreeNode。在二叉树中,您可以定义引用BinaryTreeNodeI的根字段,该字段必须缺少某些内容。。。如果我有一个名为
BinaryTree
的类,它有一个名为
root
的变量。。。我可以调用
tree.getRoot()
很好;但是,如果我看到的节点在任何更大的数据结构中都没有成员概念,那么如果我甚至不能引用父节点,我怎么能引用它所在的树呢?这个节点只知道它是子树的根。除了它的两个子节点和它所保存的数据之外,我不允许让节点知道任何东西。好的。假设Node是唯一的类,并且您正开始使用它。你应该如何使用它?您应该定义一个节点,它实际上是您的根节点,但是如何从
BinaryTreeNode
类引用它呢?这个赋值看起来很难,因为它很难。你可以定义两个类BinaryTree和BinaryTreeNode。在二叉树中,您可以定义引用BinaryTreeNodeI的根字段,该字段必须缺少某些内容。。。如果我有一个名为
BinaryTree
的类,它有一个名为
root
的变量。。。我可以调用
tree.getRoot()
很好;但是,如果我看到的节点在任何更大的数据结构中都没有成员概念,那么如果我甚至不能引用父节点,我怎么能引用它所在的树呢?这个节点只知道它是子树的根。除了它的两个子节点和它所保存的数据之外,我不允许让节点知道任何东西。好的。假设Node是唯一的类,并且您正开始使用它。你应该如何使用它?您应该定义一个节点,它实际上是您的根