Java 如何在树节点中没有父链接的情况下获取二叉树的根?
我的任务是做以下工作: 编写、记录(内部)和测试Java程序以解决以下问题: 使用链接表示法实现二叉树ADT,其中每个节点包含以下内容:Java 如何在树节点中没有父链接的情况下获取二叉树的根?,java,algorithm,binary-tree,Java,Algorithm,Binary Tree,我的任务是做以下工作: 编写、记录(内部)和测试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是唯一的类,并且您正开始使用它。你应该如何使用它?您应该定义一个节点,它实际上是您的根