【问题标题】:Is this list a Binary Search Tree?这个列表是二叉搜索树吗?
【发布时间】:2017-09-01 21:58:21
【问题描述】:
以下列表是否为 BST?
list:{2,5,3,8,6}
有什么方法可以确定吗?
假设我的列表将包含 100000 个元素。
【问题讨论】:
-
维基百科知道许多基本数据类型,包括BST。但是,如果您有一个 排序列表,则可以在其上运行 Binary Search。 Binary Search 是一种算法,而不是像 Binary Search Tree 这样的数据类型——根据定义,BST 必须始终有效地排列(作为树),但列表可能并不总是保持排序(除非它是“Sorted列表”或其他东西 ;-)
标签:
java
binary-tree
binary-search
【解决方案1】:
快速回答是:不。 BST 是一棵树,你有一个列表。
长答案是:可以将树编码为列表,在这种情况下,您的列表是否可以解码为树将取决于编码算法。有关详细信息,请参阅 BST wiki 页面http://en.wikipedia.org/wiki/Binary_search_tree
事实上,您的列表可能是 BST 的编码版本。如果您从左到右读取元素,将它们推入堆栈,并且每当您堆栈有 3 个元素时:
parent = pop()
right = pop()
left = pop()
push new Node(parent, left, right)
那么你应该得到一个有效的 BST。但我只是在这里推测。
【解决方案2】:
你有一个列表,你需要从这个列表中构造 BST
BST 具有以下属性
1- 每个节点有两个孩子或者是叶子节点
2- 对于每个节点,它的左子树小于节点的值
3- 对于每个节点,它的右子树都大于节点的值
bst 必须平衡,即在 BST 中插入节点时,代码必须遵守上述 3 个条件。
在 BST 中搜索是 O(log n) 操作,因为 ,每个搜索步骤将搜索空间分成两半并选择一半。
有一种情况,搜索需要 O(N) 时间
考虑关注
节点 = {1,2,3,4,5}
如果我们从这个节点集合中创建 BST,它将是右对齐的,这意味着每个下一个节点都将在右子树上,这里如果我们想搜索一个项目,我们需要像链接一样遍历整个右子树列表。