我不明白二进制搜索树总是被定义为“已排序”。我得到一个二进制堆的数组表示,你有一个完全排序的数组。我没有看到二进制搜索树的数组表示,所以我很难看到它们像数组一样排序,例如[0,1,2,3,4,5],而是相对于每个节点排序。什么是从概念上考虑BST被“排序”的正确方法?
答案 0 :(得分:7)
有许多类型的二叉搜索树。所有这些都有一个共同点:它们满足一个启用二进制搜索的不变量,即一个顺序关系,通过它可以将树中的每个元素与树中的任何其他元素进行比较,在total preorder中
这是什么意思?
让我们考虑教科书中BST不变量的典型陈述,其中说明每个节点的密钥大于其左子树中的所有密钥,并且小于其右侧的所有密钥。子树。我们省略了比较相等的密钥的冲突解决细节。
我向一类三岁孩子解释它的方法是尝试将所有节点折叠到叶子的底层,让它们掉下来。或者,对于高中生,从每个节点/键上绘制一条线,将它们投影在x轴上。一旦你这样做,显然键已经按(升序)顺序。
这个想象和随意的观察是否类似于我们对排序序列的定义?是的。由于BST的元素满足总预订顺序,因此BST的有序遍历必须按顺序生成这些元素(例如:证明它)。
相当于声明如果我们通过有序遍历存储了BST的键,则在数组中对数组进行排序。
因此,通过我们对BST的初步定义,有序遍历是一种直观的思维方式,即排序"。
答案 1 :(得分:1)
答案 2 :(得分:0)
它不是“排序”的,相同的意义上可以对数组进行排序(除了堆之外,树很少表示为数组),但它们的结构允许您按排序顺序轻松遍历元素:使用深度优先搜索简单地遍历BST的节点,并在查看其左子节点(如果有)之后但在查看其右子节点(如果有)之前输出每个节点的值。
顺便说一下,存储堆的数组几乎总是不排序。堆本身也可以不被称为“已排序”,因为它没有足够的结构来能够以排序的顺序容易地生成元素而不会通过连续删除顶部元素来破坏堆。例如,虽然您确实知道顶部元素大于它的两个子元素(或者更小,取决于堆类型),但您无法预先告知哪个子元素小于另一个子元素。
答案 3 :(得分:0)
就数据结构而言(数组,树,链表等),“已排序”意味着按顺序遍历所有元素,您会发现它们的值按照某些规则排序(>,< ;,< =等)。
对于数组,这很容易描绘,因为它是线性数据结构。 但是,树不会通过BST迭代,您会注意到所有元素都是根据规则左值< = node value<正确的价值(或类似的东西);排序数据结构的定义。