考虑到最浅叶子位于 k 层,AVL 树中的最小节点数

问题描述 投票:0回答:1

我的老师在课堂上问了这个问题,求 AVL 树中最近叶子的深度为 K 的最小节点数。但是有一个问题,就像我们必须在 O(1) 时间内完成,而不是递归公式。

我的方法是这样的:对于最少的节点数,树的高度也需要为k(其中k是最近叶子节点的深度)。但得出这个结论后,我想到的唯一方法是高度为 h 的 AVL 树中最小节点数的递归方法,即 N(h) = N(h-1) + N(h-2) +1,其中 N(0)=0 且 N(1) = 1。但是我的教授要求不要递归地执行此操作,而是为此给出 O(1) 解决方案。是否可以?如果是这样,任何人都可以分享一些提示。

c++ data-structures tree binary-tree avl-tree
1个回答
0
投票

对于最小节点数,树的高度也需要为 k(其中 k 是最近叶节点的深度)。

是的,这是正确的做法。

因此,所有根到叶路径的长度为𝐾。如果路径较短,则最近的叶节点的深度小于 𝐾,如果路径较长,则树的高度将大于 𝐾。

换句话说,所有叶子节点都位于树的最底层。例如,完美二叉树就是这种情况。

然而,我们可以在不破坏条件的情况下从完美二叉树中删除一些叶子,即不降低树的高度,也不创建新叶子(其深度小于𝐾)。

完美树的示例(𝐾=3):

                    _____ 8 _____
                   /             \
                _ 4 _          _ 12 _
               /     \        /      \
              2       6      10      14
             / \     / \    /  \    /  \
            1   3   5   7  9   11  13  15

我们可以删除一半的叶子,而不创建新的叶子,也不会破坏 AVL 属性,也不会降低高度:

                    _____ 8 _____
                   /             \
                _ 4 _          _ 12 _
               /     \        /      \
              2       6      10      14
             /       /      /       /   
            1       5      9       13

我们无法在不违反其中一项要求的情况下删除更多节点。

这棵“最小”树的特点是,它是一棵高度为 𝐾−1 的完美树,其中每片叶子都附有一个子节点(无论是左子节点还是右子节点)。

这样一棵树有多少个节点?

高度为𝐾−1 的完美树有 2𝐾−1 个节点。它有 2𝐾−1 叶子。对于每个节点,我们必须计算一个额外的节点(以创建底层),以便总共有 2𝐾−1 + 2𝐾−1 节点,或者换句话说: 3∙2𝐾−1 −1。对于 𝐾=0(单个节点),答案就是 1。

如代码:

k > 0 ? (3<<(k-1))-1 : 1 
© www.soinside.com 2019 - 2024. All rights reserved.