zoukankan      html  css  js  c++  java
  • 判断一个二叉树是否为满二叉树

    数据结构作业……本来想随便抄一份,结果网上的代码好麻烦的样子orz

    一个满二叉树节总结点数等于2^最大深度-1
    满二叉树

    最大深度可通过层次遍历求出。
    代码如下

    /**< 判断一个二叉树是否为满二叉树 */
    #include <cstdio>
    #include <cstdlib>
    
    struct BiTree
    {
        int data;
        BiTree * lchild;
        BiTree * rchild;
    };
    
    void build(BiTree * &tr)
    {
        int data;
        scanf("%d", &data);
        if (data == -1)
        {
            tr = NULL;
        }
        else
        {
            tr = (BiTree *)malloc(sizeof(BiTree));
            tr->data = data;
            build(tr->lchild);
            build(tr->rchild);
        }
    }
    
    void print(BiTree *tr)
    {
        if (tr != NULL)
        {
            printf("%d ", tr->data);
            print(tr->lchild);
            print(tr->rchild);
        }
    }
    
    bool isFull(BiTree * tr)
    {
        //1 << 最大深度 = 节点个数 +1
        struct Node
        {
            BiTree *tree;
            int cnt;           //深度
        };
        Node que[100];         //通过数组实现简单队列
        if (tr == NULL)
            return true;
        int rear = 0, front = 0;
        que[rear].tree = tr;
        que[rear].cnt = 0;
        int deep = 0;
        int tot = 0;
        while (rear >= front)
        {
            if (que[front].tree != NULL)
            {
                tot++;
                que[++rear].tree = que[front].tree->lchild;  //入队
                que[rear].cnt = que[front].cnt + 1;
                que[++rear].tree = que[front].tree->rchild;  //入队
                que[rear].cnt = que[front].cnt + 1;
                if (deep < que[rear].cnt)
                    deep = que[rear].cnt;
            }
            front++;  //出队
        }
        printf("
    deep=%d, tot=%d
    ", deep, tot);
        return 1 << deep == tot + 1;
    }
    
    int main()
    {   //1 2 -1 -1 3 -1 -1
        //1 2 4 -1 -1 -1 3 5 -1 -1 6 -1 -1
        //1 2 3 -1 -1 4 5 -1 -1 6 -1 -1 7 -1 -1
        BiTree *tr;
        printf("请以先序遍历输入结点数据,输入-1表示该结点为空
    ");
        build(tr);
        printf("建好的树先序输出如下
    ");
        print(tr);
        printf("
    该二叉树%s满二叉树", isFull(tr) ? "是" : "不是");
    
        return 0;
    }
    

      

  • 相关阅读:
    Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图
    【设计模式】状态模式
    【设计模式】策略模式
    【设计模式】迭代器模式
    【设计模式】观察者模式
    【设计模式】享元模式
    【设计模式】桥接模式
    【设计模式】组合模式
    【设计模式】外观模式
    【设计模式】代理模式
  • 原文地址:https://www.cnblogs.com/wenruo/p/4492693.html
Copyright © 2011-2022 走看看