二叉树的计数

二叉树的遍历也常常用来对二叉树进行计数。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef char ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *lchild;
    struct Node *rchild;
}*BitTree,BitNode;  

void CreateBitTree2(BitTree *T,char str[]);//非递归创建二叉树
void DestroyBitTree(BitTree *T);//销毁二叉树
int LeafNum(BitTree T);//统计二叉树中的叶子结点的数目
int NotLeafCount(BitTree T);//统计二叉树中的非叶子结点的数目
int BitTreeDepth(BitTree T);//计算二叉树的深度  

#include "LinkBiTree.h"  

void CreateBitTree2(BitTree *T,char str[])//非递归创建二叉树
{
    char ch;
    BitTree stack[MAXSIZE];
    int top = -1;
    int flag,k;
    BitNode *p;
    *T = NULL,k = 0;
    ch = str[k];
    while(ch != '\0')
    {
        switch(ch)
        {
        case '(':
            stack[++top] = p;
            flag = 1;
            break;
        case ')':
            top--;
            break;
        case ',':
            flag = 2;
            break;
        default:
            p = (BitTree)malloc(sizeof(BitNode));
            p->data = ch;
            p->lchild = NULL;
            p->rchild = NULL;
            if(*T == NULL)
            {
                *T = p;
            }
            else
            {
                switch(flag)
                {
                case 1:
                    stack[top]->lchild = p;
                    break;
                case 2:
                    stack[top]->rchild = p;
                    break;
                }
            }
        }
        ch = str[++k];
    }
}
void DestroyBitTree(BitTree *T)//销毁二叉树
{
    if(*T)
    {
        if((*T)->lchild)
        {
            DestroyBitTree(&((*T)->lchild));
        }
        if((*T)->rchild)
        {
            DestroyBitTree(&((*T)->rchild));
        }
        free(*T);
        *T = NULL;
    }
}
int LeafNum(BitTree T)//统计二叉树中的叶子结点的数目
{
    if(!T)
    {
        return 0;
    }
    else if(!T->lchild && !T->rchild)
    {
            return 1;
    }
    else
    {
        return LeafNum(T->lchild)+LeafNum(T->rchild);
    }
}
int NotLeafCount(BitTree T)//统计二叉树中的非叶子结点的数目
{
    if(!T)
    {
        return 0;
    }
    else if(!T->lchild && !T->rchild)
    {
        return 0;
    }
    else
    {
        return NotLeafCount(T->lchild)+NotLeafCount(T->rchild)+1;
    }
}
int BitTreeDepth(BitTree T)//计算二叉树的深度
{
    if(T == NULL)
    {
        return 0;
    }
    else
    {
        return BitTreeDepth(T->lchild) > BitTreeDepth(T->rchild)
            ? 1+BitTreeDepth(T->lchild) : 1+BitTreeDepth(T->rchild);
    }
}  

#include "LinkBiTree.h"  

int main(void)
{
    BitTree T,root;
    int num,depth;
    printf("根据括号嵌套建立二叉树:(a(b(c,d),e(f(,g),h(i))))\n");
    CreateBitTree2(&T,"(a(b(c,d),e(f(,g),h(i))))");
    num = LeafNum(T);
    printf("叶子结点的个数 = %2d\n",num);
    num = NotLeafCount(T);
    printf("非叶子结点的个数 = %2d\n",num);
    depth = BitTreeDepth(T);
    printf("二叉树的深度 = %2d\n",depth);
    printf("根据括号嵌套建立二叉树:(A(B(D(,H(J)),E(,I(K,L))),C(F,G)))\n");
    CreateBitTree2(&root,"(A(B(D(,H(J)),E(,I(K,L))),C(F,G)))");
    num = LeafNum(root);
    printf("叶子结点的个数 = %2d\n",num);
    num = NotLeafCount(root);
    printf("非叶子结点的个数 = %2d\n",num);
    depth = BitTreeDepth(root);
    printf("二叉树的深度 = %2d\n",depth);
    DestroyBitTree(&T);
    DestroyBitTree(&root);
    return 0;
}  

运行结果如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 10:22:09

二叉树的计数的相关文章

【数论】卡特兰数

Catanlan Number     卡特兰数,又称卡塔兰数(Catanlan Number),是一个非常多见.高深的数列.它能解决我们数论题目中一些计数问题.前几项为:1,2,5,14,42,132,429,1430,4862,16796,58786……          那么如何求Catanlan Number的第N项呢? 1. 2. 3. 4. 5. 着重需要介绍一下的是卡特兰数的功能 例一:二叉树的计数 n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)

BZOJ 2111 Perm 排列计数(满二叉树)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2111 题意:求1到n有多少种排列满足:A[i]>A[i/2](2<=i<=n). 思路:形式类似二叉树.建模之后其实就是n个节点的不同的满二叉树有多少种?用f[i]表示i个节点的满二叉树个数,则f[n]=f[L]*f[R]*C(n-1,L).其中L和R对于确定的n来说是确定的.比如n=10时,左右子树分别有6.3个点. i64 a[N],n,p,f[N]; void init(

1180. 二叉树计数

180. 二叉树计数 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 n个相同结点构成的二叉树有多少种?如3个结点的二叉树有以下5种: 输入 第一行输入n(1<=n<=30),表示结点数. 输出 输出一个整数表示二叉树的种数. 样例输入 3 样例输出 5 数据范围限制 1<=n<=30 1 #include<iostream> 2 using namespace std; 3 long long int f

Codevs 3112 二叉树计数

3112 二叉树计数 题目描述 Description 一个有n个结点的二叉树总共有多少种形态 输入描述 Input Description 读入一个正整数n 输出描述 Output Description 输出一个正整数表示答案 样例输入 Sample Input 6 样例输出 Sample Output 132 数据范围及提示 Data Size & Hint 1<=n<=20 /* 假设该二叉树的左子树有i个节点,则右子树有n-i-1个节点 用fs(n)表示n个节点的二叉树不同的

[Catalan数]1086 栈、3112 二叉树计数、3134 Circle

1086 栈 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何一门数据结构的课程都会介绍栈.宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙 宁宁考虑的

二叉树计数(codevs 3112)

题目描述 Description 一个有n个结点的二叉树总共有多少种形态 输入描述 Input Description 读入一个正整数n 输出描述 Output Description 输出一个正整数表示答案 样例输入 Sample Input 6 样例输出 Sample Output 132 数据范围及提示 Data Size & Hint 1<=n<=20 /* 复习一下卡特兰数,以备考试考上模板(虽然可能性不大) 递推式:h[1]=1,h[i]=(4*i-2)*h[i-1]/(n

【codevs】3112 二叉树计数

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个有n个结点的二叉树总共有多少种形态 输入描述 Input Description 读入一个正整数n 输出描述 Output Description 输出一个正整数表示答案 样例输入 Sample Input 6 样例输出 Sample Output 132 数据范围及提示 Data Size & Hint 1<=n<=20 分析 catalan数 f[2]=f[3]=

用二叉树实现学生成绩的计数(随机产生100个学生成绩)

function Node(data, left, right) { this.data = data; this.count = 1; this.left = left; this.right = right; this.show = show; } function show() { return this.data; } function BST() { this.root = null; this.insert = insert; this.find = find; this.inser

长沙理工大学第十二届ACM大赛-重现赛 大家一起来数二叉树吧 (组合计数)

大意: 求n结点m叶子二叉树个数. 直接暴力, $dp[i][j][k][l]$表示第$i$层共$j$节点, 共$k$叶子, 第$i$层有$l$个叶子的方案数, 然后暴力枚举第$i$层出度为1和出度为2的个数来转移. 复杂度虽然看上去是$O(n^6)$, 但实际上去掉多余状态后只有1178917, 可以通过. #include <iostream> #include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) using