这是维基百科上关于BST的一些代码:
# 'node' refers to the parent-node in this case
def search_binary_tree(node, key):
if node is None:
return None # key not found
if key < node.key:
return search_binary_tree(node.leftChild, key)
elif key > node.key:
return search_binary_tree(node.rightChild, key)
else: # key is equal to node key
return node.value # found key
现在这是一棵二叉树:
10
5 12
3 8 9 14
4 11
如果我正在搜索11,并且我在那里遵循算法,我从10开始,我右转到12,然后离开到9.然后我到达树的末端而没有找到11。 但是我的树中存在11,它就在另一边。
请问您能解释一下二叉树中有什么限制可以让这个算法在我的树上工作吗?
感谢。
答案 0 :(得分:10)
这只是因为您的树不是二叉搜索树:它没有正确排序。实际上,BST是按照算法中的描述构建的。例如,在你的树中:节点'9'不在正确的位置,因为9&lt; 10它应该在你的根节点'10'的左分支之下。 “14”和“11”应该在右侧分支上相同。
例如,BST可能是这样的: 10
5 11
3 8 12
14
答案 1 :(得分:3)
不要在二叉树和二叉搜索树之间混淆。二叉搜索树(简称为BST)是一种特殊类型的二叉树,其中左边的所有节点都小于或等于父节点,右边的所有节点都大于父节点。
虽然您给出的示例只是二叉树而不是二进制搜索树。您可以看到值11和14留给父节点10,这违反了BST属性。看一下here二叉搜索树。
答案 2 :(得分:3)
您提供的树不是BST。 11和14将从未插入到10的左侧,这就是算法不在那里搜索的原因。 9也不合适。
根据维基百科插入:
插入开始时搜索将开始;如果根不等于该值,我们像以前一样搜索左或右子树。最终,我们将到达外部节点并将值添加为其右子节点或左子节点,具体取决于节点的值。换句话说,我们检查根并且如果新值小于根则递归地将新节点插入左子树,或者如果新值大于或等于根,则递归插入右子树。
如果Binary Tree具有这些属性(也来自维基百科),您可以告诉它是BST:
- 节点的左子树仅包含键小于节点键的节点。
- 节点的右子树只包含键大于节点键的节点。
- 左右子树也必须是二叉搜索树。
醇>
答案 3 :(得分:1)
您已将节点14和11放在错误的位置。来自the Wikipedia article on BSTs:
- 节点的左子树仅包含键小于的子节点 节点的密钥。
- 节点的右子树只包含密钥大于的节点 节点的密钥。
- 左右子树也必须是二叉搜索树。
如您所见,14和11都大于8。
答案 4 :(得分:1)
您的树不是二叉搜索树