null是二叉树吗?

时间:2013-09-21 21:04:05

标签: algorithm binary-tree binary-search-tree

所以我看过一些例如

How to validate a Binary Search Tree?

http://www.geeksforgeeks.org/check-if-a-binary-tree-is-subtree-of-another-binary-tree/

它们返回1,或者true是树是null。 稍微扩展问题 - 假设我必须找到TreeSmall是TreeBig的子树,而我的TreeSmall是nullcheckSubtree(smallTree)的返回值是真还是假? true表示TreeSmall是tree,其值为null。这对我没有意义。

3 个答案:

答案 0 :(得分:2)

在纯计算机科学中,null是一个有效的二叉树。它被称为二叉树。就像一个空集仍然是一个有效的集。此外,只有一个根节点且没有子节点的二叉树也是有效的(但不是空的)。有关详细信息,请参阅this Stack Overflow answer

在实际实施中,有两种方法可以解决这个问题。

  1. 假设有效的二叉树必须至少有一个节点,并且不允许空树。每个节点都不必有孩子。此树上的所有递归方法都不会下降到null级别。相反,当他们看到节点的左子节点或右子节点为空时,它们会停止。只要您不将null传递给期望树的任何地方,此实现就会起作用。

  2. 假设null是一个有效的二叉树(正式地说,只是空树)。在此实现中,首先检查指针是否为空,然后对其执行任何操作(如检查左/右子项等)。此实现适用于任何指向树的指针。您可以自由地将空指针传递给期望树的方法。

  3. 两种方式都有效。第二种实现具有灵活性的优点。您可以将null传递给任何需要树的东西,它不会引发异常。第一个实现的优点是不会浪费时间降为空的“子节点”,并且您不必在节点上运行的每个函数/方法的开头使用空值检查。你只需要为孩子做空检查。

答案 1 :(得分:0)

这取决于应用程序,是一个定义问题。

编辑:

例如,维基百科“定义”BST如下:

  

在计算机科学中,二叉搜索树(BST),有时也称为有序或有序二叉树,是一种基于节点的二叉树数据结构,具有以下属性:

     
      
  • 节点的左子树仅包含键小于节点键的节点。
  •   
  • 节点的右子树只包含键大于节点键的节点。
  •   
  • 左右子树也必须都是二叉搜索树。
  •   
  • 必须没有重复的节点
  •   

让我们测试一下null

  • 左子树不存在,因此没有违反此规则的节点 - >检查
  • 类似于第一个 - >检查
  • 如果所有这些测试都通过了,那么它也会通过,因为两个子树都是null - >检查
  • 当然没有重复 - >检查

因此,通过此定义null是有效的BST。您可以通过还要求“必须有一个根节点”来反转此操作。这不会影响BST的任何实际属性,但可能会显式应用。

答案 2 :(得分:0)

Ex falso sequitur quodlibet - 因为“null”什么都不是,它可以被解释为任何东西。这真的是一个设计问题。有些人可能会声称checkSubTree()在这种情况下应该抛出类似IllegalArgumentException的东西。另一种方法是引入一种特殊类型的对象或实例,它代表一棵空树(参见NullObjectPattern)。这样的零对象将是所有帐户的树,例如, EmptyTree instanceof Tree,而null instanceof Tree总是假的。