如何判斷一棵二叉樹是完全二叉樹

嚴蔚敏那本教材上的說法:一個深度爲k,節點個數爲 2^k - 1 的二叉樹爲滿二叉樹。這個概念很好理解,

就是一棵樹,深度爲k,並且沒有空位。

首先對滿二叉樹按照廣度優先遍歷(從左到右)的順序進行編號。

一顆深度爲k二叉樹,有n個節點,然後,也對這棵樹進行編號,如果所有的編號都和滿二叉樹對應,那麼這棵樹是完全二叉樹。

任意的一個二叉樹,都可以補成一個滿二叉樹。這樣中間就會有很多空洞。在廣度優先遍歷的時候,如果是滿二叉樹,或者完全二叉樹,這些空洞是在廣度優先的遍歷的末尾,所以,但我們遍歷到空洞的時候,整個二叉樹就已經遍歷完成了。而如果,是非完全二叉樹,

我們遍歷到空洞的時候,就會發現,空洞後面還有沒有遍歷到的值。這樣,只要根據是否遍歷到空洞,整個樹的遍歷是否結束來判斷是否是完全的二叉樹。

這裏寫圖片描述

算法如下:

[cpp] view plain copy

bool is_complete(tree *root)  
{  
    queue q;  
    tree *ptr;  
    // 進行廣度優先遍歷(層次遍歷),並把NULL節點也放入隊列  
    q.push(root);  
    while ((ptr = q.pop()) != NULL)  
    {  
        q.push(ptr->left);  
        q.push(ptr->right);  
    }  

    // 判斷是否還有未被訪問到的節點  
    while (!q.is_empty())  
    {  
        ptr = q.pop();  

        // 有未訪問到的的非NULL節點,則樹存在空洞,爲非完全二叉樹  
        if (NULL != ptr)  
        {  
            return false;  
        }  
    }  

    return true;  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章