判斷二叉樹是否爲徹底二叉樹

算法思路來自博客:http://blog.csdn.net/wuruiaoxue/article/details/46797815算法

 

要判斷一顆二叉樹是否爲徹底二叉樹,首先應該看一下徹底二叉樹的定義:數據結構

徹底二叉樹(來自數據結構課本的定義):約定從根起,自上而下,自左而右,給滿二叉樹中的每一個結點從1到n連續編號,編號爲i的結點可稱爲i結點。深度爲k且且含n個結點的二叉樹,若是其每一個結點都與深度爲k的滿二叉樹中編號從1至n一一對應,則稱爲徹底二叉樹。ui

 

有定義可見,「從根起,自上而下,自左而右」。可見咱們應該用層次遍歷的思路。spa

層次遍歷二叉樹:按二叉樹的層次從小到大且每層從左到右的順序一次訪問結點。.net

 

來看看算法思路:指針

根據徹底二叉樹的定義,對徹底二叉樹按照從上到下、從左到右的層次遍歷,應該知足一下兩條要求:
●某節點沒有左孩子,則必定無右孩子
●若某節點缺左或右孩子,則其全部後繼必定無孩子
若不知足上述任何一條,均不爲徹底二叉樹。code


算法思路:採用層序遍歷算法,用cm變量值表示迄今爲止二叉樹爲徹底二叉樹(其初值爲1,一旦發現不知足上述條件之一,則置cm爲0),bj變量值表示迄今爲止全部節點均有左右孩子(其初值爲1),一旦發現一個節點沒有左孩子或沒有右孩子時置bj爲0),在遍歷完畢後返回cm的值。blog

 

來看代碼:(直接上anyview的代碼)隊列

/**********
【題目】編寫算法判別給定二叉樹是否爲徹底二叉樹。
二叉鏈表類型定義:
typedef struct BiTNode {
  TElemType data;
  struct BiTNode  *lchild, *rchild;
} BiTNode, *BiTree;
可用隊列類型Queue的相關定義:
typedef BiTree QElemType; // 設隊列元素爲二叉樹的指針類型
Status InitQueue(Queue &Q);
Status EnQueue(Queue &Q, QElemType e);
Status DeQueue(Queue &Q, QElemType &e);
Status GetHead(Queue Q, QElemType &e);
Status QueueEmpty(Queue Q);
**********/
Status CompleteBiTree(BiTree T)
/* 判別二叉樹T是否爲徹底二叉樹 */
{
    if(T==NULL)return TRUE;//空樹確定是啦
    //要用層次遍歷
    Queue Q;
    InitQueue(Q);
    BiTree p = T;
    int cm = 1;//用cm變量值表示迄今爲止二叉樹爲徹底二叉樹(其初值爲1,一旦發現不知足上述條件之一,則置cm爲0
    //結束後返回cm的值
    
    int bj = 1;//bj變量值表示迄今爲止全部節點均有左右孩子(其初值爲1),一旦發現一個節點沒有左孩子或沒有右孩子時置bj爲0
    
    if( !p->lchild && p->rchild )return FALSE;//若是根只有右子樹,沒有左子樹,確定就不是
    EnQueue(Q, p);
    while(DeQueue(Q, p)==OK && cm) {
            
        if(p->lchild && p->rchild) {
            if(bj==0)cm = 0;//bj爲0說明上一顆樹沒有右孩子或者說兩個孩子都沒,因此這棵樹不能有孩子
            EnQueue(Q, p->lchild);
            EnQueue(Q, p->rchild);
        } 
        
         if(p->lchild && !p->rchild) { //若是這棵樹只有左子樹,在隊列後面那顆樹必定不能有孩子  
            if(bj==0)cm = 0;//bj爲0說明上一顆樹沒有右孩子或者說兩個孩子都沒,因此這棵樹不能有孩子
            EnQueue(Q, p->lchild);
            bj = 0;
        }
        
        if(!p->lchild && p->rchild) {   //只有右孩子,沒有左孩子直接判死刑
            cm = 0;
        }
        
        if(!p->lchild && !p->rchild) {   //兩個孩子都沒有,則隊列中的下一個元素不能有孩子
            bj = 0;
        }
    }
    return cm;
}
相關文章
相關標籤/搜索