美文网首页
判断完全二叉树

判断完全二叉树

作者: 加油_汤姆叔叔 | 来源:发表于2019-07-08 14:40 被阅读0次

判断一棵树是否是完全二叉树
(1)若root为空则不是。
(2)如果不为空,怎对二叉树进行层序遍历。
(2.1)如果节点的左右子节点均存在,则将左右子树从队列中pop出,并将其左右子节点入队。
(2.2)如果节点左子节点不存在而右子节点存在,则是二叉树。
(2.3)如果节点左子节点存在而右子节点不存在,或者左右子节点均不存在,则该节点之后队列中的节点均为叶子节点(也是左右子节点均不存在)才会是完全二叉树。

#include <iostream>
#include <queue>
 
using namespace std;
 
template <class T>
struct TreeNode
{
    T data;
    TreeNode<T> *left;
    TreeNode<T> *right;
    TreeNode(const T &x) : data(x),
                           left(NULL),
                           right(NULL) {}
};
template <class T>
bool IsComplete(TreeNode<T> *root)
{
    //1.树为空,返回错误
    if (root == NULL)
    {
        return false;
    }
    //2.树不为空
    queue<TreeNode<T> *> q;
    q.push(root);
    while (!q.empty())
    {
        TreeNode<T> *top = q.front();
        //2.1如果该节点两个孩子都有,则直接pop
        if (top->left && top->right)
        {
            q.pop();
            q.push(top->left);
            q.push(top->right);
        }
        //2.2如果该节点左孩子为空,右孩子不为空,则一定不是完全二叉树
        if (top->left == NULL && top->right)
        {
            return false;
        }
        //2.3如果该节点左孩子不为空,右孩子为空或者该节点为叶子节点,则该节点之后的所有结点都是叶子节点
        if ((top->left && top->right == NULL) || (top->left == NULL && top->right == NULL))
        {
                        if (NULL != top->left && NULL == top->right) 
                        {
                            q.push(top->left);    
                        }
            q.pop(); //则该节点之后的所有结点都是叶子节点
            while (!q.empty())
            {
                top = q.front();
                if (top->left == NULL && top->right == NULL)
                {
                    q.pop();
                }
                else
                {
                    return false;
                }
            }
            return true;
        }
    }
    return true;
}
 
//满二叉树
void test1()
{
    //       1
    //   2       3
    // 4    5  6   7
    TreeNode<int> *node1 = new TreeNode<int>(1);
    TreeNode<int> *node2 = new TreeNode<int>(2);
    TreeNode<int> *node3 = new TreeNode<int>(3);
    TreeNode<int> *node4 = new TreeNode<int>(4);
    TreeNode<int> *node5 = new TreeNode<int>(5);
    TreeNode<int> *node6 = new TreeNode<int>(6);
    TreeNode<int> *node7 = new TreeNode<int>(7);
    node1->left = node2;
    node1->right = node3;
    node2->left = node4;
    node2->right = node5;
    node3->left = node6;
    node3->right = node7;
    cout << IsComplete<int>(node1) << endl;
}
 
//二叉树为空
void test2()
{
    cout << IsComplete<int>(NULL) << endl;
}
 
//3.二叉树不为空,也不是满二叉树,遇到一个结点左孩子为空,右孩子不为空
void test3()
{
    //       1
    //   2       3
    // 4    5      7
    TreeNode<int> *node1 = new TreeNode<int>(1);
    TreeNode<int> *node2 = new TreeNode<int>(2);
    TreeNode<int> *node3 = new TreeNode<int>(3);
    TreeNode<int> *node4 = new TreeNode<int>(4);
    TreeNode<int> *node5 = new TreeNode<int>(5);
    TreeNode<int> *node7 = new TreeNode<int>(7);
    node1->left = node2;
    node1->right = node3;
    node2->left = node4;
    node2->right = node5;
    node3->right = node7;
    cout << IsComplete<int>(node1) << endl;
}
 
//4.二叉树不为空,也不是满二叉树,遇到叶子节点,则该叶子节点之后的所有结点都为叶子节点
void test4()
{
    //        1
    //    2       3
    // 4    5
    TreeNode<int> *node1 = new TreeNode<int>(1);
    TreeNode<int> *node2 = new TreeNode<int>(2);
    TreeNode<int> *node3 = new TreeNode<int>(3);
    TreeNode<int> *node4 = new TreeNode<int>(4);
    TreeNode<int> *node5 = new TreeNode<int>(5);
    node1->left = node2;
    node1->right = node3;
    node2->left = node4;
    node2->right = node5;
    cout << IsComplete<int>(node1) << endl;
}
 
//4.二叉树不为空,也不是满二叉树,遇到左孩子不为空,右孩子为空的结点,则该节点之后的所有结点都为叶子节点
void test5()
{
    //        1
    //    2       3
    // 4    5   6
    TreeNode<int> *node1 = new TreeNode<int>(1);
    TreeNode<int> *node2 = new TreeNode<int>(2);
    TreeNode<int> *node3 = new TreeNode<int>(3);
    TreeNode<int> *node4 = new TreeNode<int>(4);
    TreeNode<int> *node5 = new TreeNode<int>(5);
    TreeNode<int> *node6 = new TreeNode<int>(6);
    node1->left = node2;
    node1->right = node3;
    node2->left = node4;
    node2->right = node5;
    node3->left = node6;
    cout << IsComplete<int>(node1) << endl;
}
 
int main()
{
    test1();
    /*test2();*/
    /*test3();*/
    /*test4();*/
    /*test5();*/
    return 0;
}

相关文章

  • 958. 二叉树的完全性检验

    判断是否是完全二叉树 给定一个二叉树,确定它是否是一个完全二叉树。 百度百科中对完全二叉树的定义如下: 若设二叉树...

  • 二叉树常见问题

    1 判断类问题 判断类问题主要分判断二叉树是否是二叉搜索树、二叉完全树,以及两棵二叉树是否同构这三个问题。 1.1...

  • leetcode-Easy-29-Tree-Same tree

    题目判断二叉树是否完全一样 Given two binary trees, write a function to...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 判断完全二叉树

    判断一棵树是否是完全二叉树(1)若root为空则不是。(2)如果不为空,怎对二叉树进行层序遍历。(2.1)如果节点...

  • 判断一棵树是否是搜索二叉树、判断一棵树是否是完全二叉树

    题目描述 判断一棵树是否是搜索二叉树、判断一棵树是否是完全二叉树 什么是二叉查找树? 二叉查找树(Binary S...

  • 1 二叉树的最近公共祖先(leetcode 236) 2 判断是否为平衡二叉树 3 判断二叉树是否为满二叉树 4 ...

  • 平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 思路 思路1:从上而下的判断。从根节点开始,判断是不是平...

  • 平衡二叉树

    题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。 思路法一:每次判断当前树的左右子树高度差,然后判断子树的子...

  • 数据结构面试题5

    一、判断是否是完全二叉树 1、法一 1>如果树为空,则直接返回错2>如果树不为空:层序遍历二叉树2.1>如果一个结...

网友评论

      本文标题:判断完全二叉树

      本文链接:https://www.haomeiwen.com/subject/pbiohctx.html