【问题标题】:How do I get the root of a binary tree without having parent links in a tree node?如何在树节点中没有父链接的情况下获取二叉树的根?
【发布时间】:2013-02-25 18:49:29
【问题描述】:

我有以下任务:

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

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

  • 数据
  • 左孩子的参考/链接
  • 引用/链接到正确的孩子

假设数据是整数值。

实现以下操作(如教科书7.3节所述):

  • 尺寸
  • 是空的
  • 替换
  • 已离开
  • 有权利
  • 是内部的
  • 是外部的
  • 是根
  • 向左插入
  • 插入右
  • 附上
  • 移除

还有以下遍历:

  • 预购
  • 后购
  • 按顺序

我知道二叉树是如何工作的,并且在大多数情况下我这样做没有问题 - 但我遇到的问题是我不允许在节点类中包含除给定的三个变量之外的任何变量 - 那是,我无法建立父链接。如果我无法链接到父节点,如何检查给定节点是否是树的根?

【问题讨论】:

  • 您必须将根的引用存储在某处。检查节点 N 是否是根节点只是检查 N == 根节点。

标签: java algorithm binary-tree


【解决方案1】:

您可以定义BinaryTree 类并将Node 根字段保留在其中。所以你已经知道了根

【讨论】:

  • 但是我如何从BinaryTreeNode 类中引用它?这个任务似乎是为了难而难。
  • 您可以定义 2 个类 BinaryTree 和 BinaryTreeNode。在二叉树中您可以定义引用 BinaryTreeNode 的根字段
  • 我一定遗漏了一些东西...如果我有一个名为BinaryTree 的类有一个名为root 的变量...我可以调用tree.getRoot() 就好了;但是如果我正在查看一个在任何更大的数据结构中都没有成员资格概念的节点,那么如果我什至无法引用父节点,我该如何引用它所在的树呢?这个节点只知道它是子树的根。
  • 我不能让节点知道除了它的两个子节点和它持有的数据之外的任何东西。
  • 好的。假设 Node 是唯一的类并且您开始使用它。你应该如何使用它?您应该定义一个节点,它实际上是您的根节点
【解决方案2】:

假设你有一个孤立的节点,只知道它的左右链接节点,没有别的,没有办法确定根,除非你有一组节点要测试。 p>

显而易见的方法 - 当然 - 是使用实际上定义树的周围树结构的根属性,即此处提供的所有其他解决方案。

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

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

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;
}

【讨论】:

    【解决方案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
    

    现在我们的root 保存了所有这些信息,我们可以通过它访问连接到它的任何节点。

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

    结构如下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多