数据结构之判断一棵树是不是完满二叉树

1 完满二叉树

除了叶子结点之外的每一个结点都有两个孩子结点。

如下是完满二叉树

                             1
           2                                    3
    4              5
             6            7

2 分析 

我们按层(queue)遍历数,如果发现左子树为空右子树不为空 或者 左子树不为空右子树为空 的情况下直接返回false

3 代码实现

#include <iostream>
#include <queue>

using namespace std;

typedef struct Tree 
{
    int value;
    struct Tree* left;
    struct Tree* right;
    Tree(int value):value(value), left(NULL), right(NULL){}
} Tree;

bool isFullCompleteTree(Tree* node)
{
    if (NULL == node)
        return false;
    queue<Tree *> queue;
    queue.push(node);
    while (!queue.empty())
    {
        Tree* pNode = queue.front();
        if ((pNode->left == NULL && pNode->right != NULL) || (pNode->left != NULL && pNode->right == NULL))
            return false;
        queue.pop();
        if (pNode->left != NULL)
            queue.push(pNode->left);
        if (pNode->right != NULL)
            queue.push(pNode->right); 
    }
    return true;
}

int main()
{
    Tree node1(1);
    Tree node2(2);
    Tree node3(3);
    Tree node4(4);
    Tree node5(5);
    Tree node6(6);
    Tree node7(7);
    node1.left = &node2;
    node1.right = &node3;
    node2.left = &node4;
    node2.right = &node5;
    node5.left = &node6;
    node5.right = &node7;
    std::string res = "";
    res = (isFullCompleteTree(&node1) == 1) ? "true" : "false";
    std::cout << "Tree isFullCompleteTree is " << res << std::endl;
    return 0;
}

4 运行结果

Tree isFullCompleteTree is true
发布了1043 篇原创文章 · 获赞 630 · 访问量 286万+

猜你喜欢

转载自blog.csdn.net/u011068702/article/details/102788644