问题描述
在附图中有两个二叉搜索树。当我看到这个问题时,我认为第一棵树是不平衡的,所以它不是一棵 avl 树,而第二棵树是平衡的,它显然是一棵 avl 树。
但是这里的问题是当我看到这个问题的答案时,它给出了 (i) 和 (ii) 都是 avl 树。为什么 (i) 是一棵明显不平衡的 avl 树?
解决方法
简答
是的,如果空树的高度定义为 0
,则这两棵树都可以被视为 AVL 树。
长答案
让我们从 here 中获取 AVL 树的定义:
一个平衡的二叉搜索树,其中一个节点的两个子树(子节点)的高度最多相差一个
现在,一棵树的高度是多少?它是从根到叶子的最长路径上的许多边。
让我们从您的示例 13
中选取一个有问题的节点 i
。它的右子树是空的,它的左子树由一行 2
节点 - 10
和 11
组成:
...
13
/
11 (height = 1)
/
10 (height = 0)
...
所以,左子树的高度是1
(从它的根11
到10
的最长路径显然是1
),而右子树的高度可以被视为0
(请参阅更多here)。因此,高度的绝对差为1
。
我相信你很明显,对于树 i
中的任何其他节点,子树高度的绝对差都不大于 1
,因此该树是一棵 AVL 树。>
备注
然而,正如@templatetypedef 所指出的,如果将空子树的高度定义为 -1
,则该树不再是 AVL 树,因为 13
处的平衡因子为 {{ 1}}。因此,这完全取决于如何定义空树的高度。更糟糕的是,没有定义空树的高度 - 请检查 here。
你是对的,树 2 不是 AVL 树。根的右子树 - 以 13 为根的那个 - 是不平衡的。具体来说,它的左子树(以 11 为根的那个)的高度为 1,其(缺失的)右子树的高度为 -1,高度不平衡为 2。
这个问题的来源是什么?也许这是一个错字,或者这棵树可能不是我们想要的树?