在这个问题中,balanced
的定义是
其左子树中的节点数和其右子树中的节点数几乎相等,这意味着它们的差异不大于1
如果给定一个n
作为总节点数,这样的树有多少?
另外,如果我们将节点数
替换为高度
呢?给定一个高度
,有多少高度平衡的树?
差别只会由最后一层产生,因此你可以找到该层剩下多少节点,然后考虑所有可能的组合。拥有n
节点,你知道高度应该是floor(log(n))
因此深度k=floor(log(n))-1处的同一棵树是完全平衡的,因此你知道这是需要(
m=sum(i=0..k)2^i
节点,因此n-m
节点被留到最后一级。平衡二叉树的一些定义强制“所有节点左对齐”,在这种情况下,很明显,只有一种可能性,没有这个约束,你有2^层(log(n))
选择n-m
,因为你必须选择2^层(log(n))
可能的节点槽,强制分配总共n-m
个节点。
对于高度层,您考虑的是
2^层(log(n))
选择i
,因为i
从1到2^层(log(n))
。你可以考虑在最后一级有1个节点,然后是2个节点,依此类推,直到你没有把它变成一个完全平衡的二叉树,因此所有的2^floor(log(n))
slot都被分配了。
在上一节中,我们考虑构建一个二叉搜索树。正如我们所学到的,二叉搜索树的性能可以降级到 $$O(n)$$ 的操作,如 get 和 put ,如果树变得不平衡。在本节中,我们将讨论一种特殊类型的二叉搜索树,它自动确保树始终保持平衡。这棵树被称为 AVL树,以其发明人命名:G.M. Adelson-Velskii 和E.M.Landis。 AVL树实现 Map 抽象数据类型就像一个常规的二叉搜索树,唯一
我写了一个函数,如果给定的二叉树是二叉搜索树,则返回true,否则返回false。 我的功能对吗?
所以,我一直在研究平衡的二叉查找树。 我谷歌了一下,这是我的发现: 二叉树,其中每个节点的两个子树的深度相差 1 或更小(来自维基百科) 难道就不能把平衡二叉树定义为高度不超过ceil(log(n ^ 1)/log ^ 2)的树吗? 从这个答案来看,提问者似乎已经问了同样的事情,但是公认的答案通过举斐波纳契树的例子拒绝了这个想法。斐波纳契树不是平衡树,对吗?我认为回答者可能会与AVL树中平衡树的定
在我们继续之前,我们来看看执行这个新的平衡因子要求的结果。我们的主张是,通过确保树总是具有 -1,0或1 的平衡因子,我们可以获得更好的操作性能的关键操作。 让我们开始思考这种平衡条件如何改变最坏情况的树。有两种可能性,一个左重树和一个右重树。 如果我们考虑高度0,1,2和3的树,Figure 2 展示了在新规则下可能的最不平衡的左重树。 Figure 2 看树中节点的总数,我们看到对于高度为0的
现在我们已经证明保持 AVL树的平衡将是一个很大的性能改进,让我们看看如何增加过程来插入一个新的键到树。由于所有新的键作为叶节点插入到树中,并且我们知道新叶的平衡因子为零,所以刚刚插入的节点没有新的要求。但一旦添加新叶,我们必须更新其父的平衡因子。这个新叶如何影响父的平衡因子取决于叶节点是左孩子还是右孩子。如果新节点是右子节点,则父节点的平衡因子将减少1。如果新节点是左子节点,则父节点的平衡因子将
如果我有一个平衡的二叉树,并且我想在其中搜索一个项目,那么大的oh时间复杂度会是O(n)吗?在二叉树中搜索一个项目,不管它是否平衡,会改变O(n)的大时间复杂性吗?我知道如果我们有一个平衡的BST,那么搜索一个项目就等于BST的高度so O(log n),但是普通的二叉树呢?