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

时间:2013-02-25 18:49:30

标签: java algorithm binary-tree

我的任务是执行以下操作:

  

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

     

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

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

假设数据是整数值。

     

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

     
      
  • 尺寸
  •   
  • 的isEmpty
  •   
  • E放置
  •   
  •   
  •   
  •   
  • hasLeft
  •   
  • hasRight
  •   
  • isInternal
  •   
  • isExternal
  •   
  • isRoot
  •   
  • insertLeft
  •   
  • insertRight
  •   
  •   
  • 除去
  •   
     

以及以下遍历:

     
      
  •   
  • 后序
  •   
  •   

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

实际上,'root'可以定义为'没有父节点的节点'。

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

答案 2 :(得分:1)

使用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正在保存所有这些信息,我们可以通过它访问与之相关的任何节点。

所以你需要为所有这些操作编写一个包装器。要检查任意节点是否为根,只需将其与以root身份存储的节点进行比较。

结构如下:

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