所以我看过一些例如
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是null
,checkSubtree(smallTree)
的返回值是真还是假? true
表示TreeSmall是tree
,其值为null
。这对我没有意义。
答案 0 :(得分:2)
在纯计算机科学中,null是一个有效的二叉树。它被称为空二叉树。就像一个空集仍然是一个有效的集。此外,只有一个根节点且没有子节点的二叉树也是有效的(但不是空的)。有关详细信息,请参阅this Stack Overflow answer。
在实际实施中,有两种方法可以解决这个问题。
假设有效的二叉树必须至少有一个节点,并且不允许空树。每个节点都不必有孩子。此树上的所有递归方法都不会下降到null级别。相反,当他们看到节点的左子节点或右子节点为空时,它们会停止。只要您不将null传递给期望树的任何地方,此实现就会起作用。
假设null是一个有效的二叉树(正式地说,只是空树)。在此实现中,首先检查指针是否为空,然后对其执行任何操作(如检查左/右子项等)。此实现适用于任何指向树的指针。您可以自由地将空指针传递给期望树的方法。
两种方式都有效。第二种实现具有灵活性的优点。您可以将null传递给任何需要树的东西,它不会引发异常。第一个实现的优点是不会浪费时间降为空的“子节点”,并且您不必在节点上运行的每个函数/方法的开头使用空值检查。你只需要为孩子做空检查。
答案 1 :(得分:0)
这取决于应用程序,是一个定义问题。
编辑:
例如,维基百科“定义”BST如下:
在计算机科学中,二叉搜索树(BST),有时也称为有序或有序二叉树,是一种基于节点的二叉树数据结构,具有以下属性:
- 节点的左子树仅包含键小于节点键的节点。
- 节点的右子树只包含键大于节点键的节点。
- 左右子树也必须都是二叉搜索树。
- 必须没有重复的节点
让我们测试一下null
:
因此,通过此定义null
是有效的BST。您可以通过还要求“必须有一个根节点”来反转此操作。这不会影响BST的任何实际属性,但可能会显式应用。
答案 2 :(得分:0)
Ex falso sequitur quodlibet - 因为“null”什么都不是,它可以被解释为任何东西。这真的是一个设计问题。有些人可能会声称checkSubTree()在这种情况下应该抛出类似IllegalArgumentException的东西。另一种方法是引入一种特殊类型的对象或实例,它代表一棵空树(参见NullObjectPattern)。这样的零对象将是所有帐户的树,例如, EmptyTree instanceof Tree
,而null instanceof Tree
总是假的。