我不确定如何确定树是否平衡,完美平衡,或者如果我将它作为图片而不是代码
例如,如果我有这棵树 如何检查它是否平衡,完美平衡或不平衡? 并且有人能给我一个完美平衡树的例子吗?
[o]
/ \
[b] [p]
\ / \
[d] [m] [r]
显然,如果它是这样的话,我可以说这棵树是不平衡的:
[b]
\
[d]
\
[r]
\
[c]
然而,如果它与上面的那个非常类似,我不知道如何得到它
这是一个完美平衡和平衡的树:
[k]
/ \
[A] [p]
/ \
[N] [R]
有人可以向我解释一下吗?
答案 0 :(得分:9)
完美平衡的树应该如下所示:
[ R ]
/ \
[a] [b]
/ \ / \
[c] [d] [e] [f]
平衡:您可以说它是平衡的,因为每个节点的左右子树的高度相差1或更小(在这种情况下为0),
完美:你可以说它是完美的,因为节点的数量等于2 ^(n + 1)-1,其中n是树的高度,在这种情况下(2 ^ 3) - 1 = 7
在你的例子中,第一棵树是平衡的,但不完美,第二棵树不平衡也不完美。第三个是平衡的,因为每个节点上左右子树的深度在1或更小时不同,但它并不完美,因为根据完美的树方程,当它应该是7时节点的数量是5。
编辑:
关于你的持续评论,你在考试中得到它的事实并不意味着答案在任何意义上都是正确的。完美树的概念与完整性的概念有关,完整的树有时被称为“完美”树,它意味着除了叶子之外的每个节点的子数是2,我给你的是计算它的方程式。第三棵树是平衡的,因为重要的是每个节点的左右子树的深度,而不是左右子树中的子节点数。在这种情况下,从节点A,左子树的深度是0并且右子树的深度是0 - > 0-0 = 0,从P两个深度都是1 - > 0。 1 - 1 = 0并且从根开始,左子树的深度为1,右子树的深度为2 - > 1。 2 - 1 = 1< - 它是平衡的,因为差异应该是1或更小。
希望它有所帮助!
答案 1 :(得分:2)
完美平衡的AVL树在左子树和右子树之间的高度差不超过1
答案 2 :(得分:0)
问题应该是关于二叉树(BT),而不仅仅是二叉搜索树(BST),因为节点中数据的顺序与树是否平衡无关。一个开始的地方是https://en.wikipedia.org/wiki/Binary_tree,但它有一些问题,因为它有一些各种可能定义的混合,一些来自CS,一些来自图论。可能最有用,最矛盾的定义是:
如果每个叶子处于同一级别,则BT 完美或高度平衡,这相当于从给定节点到叶子的每条路径相同长度;如果每个内部(非叶子)节点有2个子节点,则完整;如果它是完美和充实的话,完整;它是几乎完成或接近完成如果是完美的并且所有级别但是最后一个已经满了,并且在最后一级叶子尽可能地离开(所以任何&# 34;空缺"在右边);如果每个非叶子节点只有一个子节点,那么它是退化(并且作为图形,它是从根到一个叶子的路径)。
使用这些定义:你的第一棵树完美但不完整,所以不完整 - 节点[b]缺少一个左子,并添加它会使树完整;你的第二棵树退化(一条路径);你的第三棵树是完整(每个节点但是叶子有两个孩子)和 1-height-balanced 但是两者都没有完美平衡(=完美? )"或者"平衡(意味着0-高度平衡)" ,因为并非从根到叶子的每条路径都是相同的长度。
在你的第一棵树中,如果[b]有两个孩子,但[p]只有一个左孩子,那么它将几乎完整(完美和完整除了最后一些失踪的孩子)水平和空位尽可能正确) - 这些对于在阵列中存储二进制堆很重要。
塞尔吉奥的例子是完整(完美或高度均衡,充实)。 (并注意它并不好,只会导致混淆使用"平衡"意味着" 1-height-balanced"或"完美"作为"完成"。)的同义词。
不完美(或完美平衡)的东西是k高度平衡,这意味着从给定节点到叶子的所有路径的长度最多相差k,这相当于差异在每个节点的高度中,左右子树最多为k。例如,AVL树是1高度平衡的。
原因"身高"这些定义中需要的是" weight-balanced BT"有不同的概念,根据用途有不同的定义,其中一个是每个节点左边的节点数量子树与右子树中的相同,另一个是左子树中的节点数至少是右子树中节点数的一半,最多两倍。