【面試題-鏈表】判斷一個二叉樹是否是完全二叉樹

完全二叉樹

如果二叉樹中除去最後一層節點爲滿二叉樹,且最後一層的結點依次從左到右分佈,則此二叉樹被稱爲完全二叉樹。

完全二叉樹示意圖

直接上思路。層序遍歷一下,遇到第一個葉子 那麼後面出現的節點都應該是葉子節點。當然 還要判斷上圖的b)的情況

由於沒有大量的數據來驗證,我在代碼裏自己構造了一個數據,有錯誤歡迎指正~

【代碼】

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w;
    node *left;
    node *right;
};
bool bfs(node *head)
{
    queue<node *>que;
    que.push(head);

    int flag=0;
    while(que.size())
    {
        node *now=que.front();que.pop();
        //printf("w:%d\n",now->w);

        if(flag&&(now->left!=NULL||now->right!=NULL)) {//前面出現葉子且當前不是葉子
            //printf("wwww");
            return false;
        }
        if(now->left==NULL&&now->right!=NULL) {//只有右節點

            return false;
        }
        if(now->left==NULL&&now->right==NULL) {
            flag=1;
        }
        if(now->left!=NULL) que.push(now->left);
        if(now->right!=NULL) que.push(now->right);
    }

}
int main()
{
    node *head=new node();
    head->w=1;

    node *l1=new node();
    l1->w=2;
    node *r1=new node();
    r1->w=3;

    head->left=l1;
    head->right=r1;

    node *l2=new node();
    l2->w=4;

    node *r2=new node();
    r2->w=5;

    l1->left=l2;
    l1->right=r2;

    node *l3=new node();
    l3->w=6;
    r1->left=l3;


    printf("%d\n",bfs(head));


}

 

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