如何判断二叉树是“完整的”

时间:2013-04-15 02:48:38

标签: c++ algorithm binary-search-tree complete

我不确定是什么让树完整但我需要弄清楚我的树是否完整,所以我正在做的是确保树的每个部分都是平衡的。如果树是完全平衡的,那么它是否完整?

template<typename TYPE>
bool BinarySearchTree<TYPE>::CompleteTree()
{
    return PCompleteTree(TRoot);
}

template<typename TYPE>
bool BinarySearchTree<TYPE>::PCompleteTree(Node<TYPE>* root)
{
    bool isComplete= false;
    if(root)
    {
        if(abs(PHeight(root->left) - PHeight(root->right)) >= 1)
            isComplete = ((PCompleteTree(root->left)) && (PCompleteTree(root->right)));
        else
            isComplete = false;
    }
    return isComplete;
}

3 个答案:

答案 0 :(得分:2)

完整的二叉树是指除了最后一个级别之外,每个级别都尽可能地填充所有节点。因此,可能存在平衡二叉树可能也不意味着完整二叉树的情况。

答案 1 :(得分:0)

假设我们采用a nist.gov webpage中显示的完整二叉树的定义:

  

定义:一个二叉树,其中除了可能是最深的之外,每个级别都被完全填充。在深度为n的树的高度,所有节点必须尽可能远。

上面显示的NIST链接是维基百科在其binary tree文章中定义完整二叉树的来源。 NIST网页指出,一个完整的二叉树(高度n)在每个深度k < n有2个节点,总共有2到2个节点。

确实,具有n级别的非简并完整二叉树的根的左子树具有n-1级别的完整二叉树,右子树是完整的二叉树。 n-1(或可能是n-2)级别。但是,代码中的高度测试看起来是错误编码的:当高度差为零时,它显然会设置isComplete = false。相反,如果左侧高度小于正确的高度,或者左侧子树比右侧子树高一级以上,或者任一子树不完整,则应报告为false。

答案 2 :(得分:0)

我将从nist.gov通过@jwpat7

使用此定义
  

定义:一个二叉树,其中除了可能是最深的之外,每个级别都被完全填充。在深度为n的树的高度,所有节点必须尽可能远。

现在,递归定义得到了“完美”定义的帮助:

我会用'完美'来表示“每个级别都已满或空”。如果左右子树都是完美的,并且它们具有相同的深度,则树已满。

然后我们可以递归地定义完整的如下:

树是完整的(根据上面的定义),如果它是完美的,或者左右子树是相同的高度,左边是完美的,右边是完整的,或者左边的子树是否比一个更深右边和右边是完美的,左边是完整的。