判斷一棵樹是否是完全二叉樹

這道題可以看作是層序遍歷的變形。

在二叉樹的層序遍歷中,我們藉助一個數據結構隊列,根據其先進先出的性質,實現層序遍歷。

這裏寫圖片描述

可以定義一個flag標誌位,一旦遇到空節點,標誌位生效。

相關代碼如下:

#include<iostream>
#include<queue>
using namespace std;

struct Node
{
    int _data;
    Node* _left;
    Node* _right;
    Node(const int& x)
        : _data(x)
        , _left(NULL)
        , _right(NULL)
    {}
};

//層序遍歷
void LevelOrder(Node* root)
{
    if (root == NULL)
        return;
    queue<Node*> q;

    Node* cur = root;
    q.push(cur);
    while (!q.empty())
    {
        Node* front = q.front();
        cout << front->_data << " ";
        q.pop();
        if (front->_left)
            q.push(front->_left);
        if (front->_right)
            q.push(front->_right);
    }
    cout << endl;
}

bool IsCompleteTree(Node* root)
{
    if (root == NULL)
        return false;
    queue<Node*> q;
    bool flag = 0;
    Node* cur = root;
    q.push(cur);
    while (!q.empty())
    {
        Node* front = q.front();
        q.pop();
        if (front->_left)
        {
            if (flag)
                return false;
            q.push(front->_left);
        }
        else
        {
            if (flag == 0)
                flag = 1;
        }
        if (front->_right)
        {
            if (flag)
                return false;
            q.push(front->_right);
        }
        else
        {
            if (flag == 0)
                flag = 1;
        }
    }
    return true;
}

int main()
{
    Node* p1 = new Node(1);
    Node* p2 = new Node(2);
    Node* p3 = new Node(3);
    Node* p4 = new Node(4);
    Node* p5 = new Node(5);
    Node* p6 = new Node(6);

    //完全二叉樹
    /*p1->_left = p2;
    p1->_right = p3;
    p2->_left = p4;
    p2->_right = p5;
    p3->_left = p6;*/

    //非完全二叉樹
    p1->_left = p2;
    p1->_right = p3;
    p2->_left = p4;
    p2->_right = p5;
    p3->_right = p6;

    LevelOrder(p1);
    cout << IsCompleteTree(p1) << endl;
    return 0;
}
發佈了67 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章