当前位置:嗨网首页>书籍在线阅读

11-求树中节点的个数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.3.1 求树中节点的个数

问题描述

19.png 已知二叉树采用二叉链表存储,要求编写算法,计算二叉树中度为0和度为1的节点个数。

【分析】

这是西北大学考研试题。

求二叉树中度为0的节点个数,即求叶子节点的个数,递归定义如下。

203.png 当二叉树为空时,其叶子节点个数为0。当二叉树只有一个根节点时,根节点就是叶子节点,叶子节点个数为1。其他情况下,计算左子树与右子树中叶子节点的和。

求二叉树中度为1的节点个数的递归定义如下。

204.png 当二叉树已空时,度为1的节点个数为0。当某个节点只有一个左子节点或右子节点时,则这个节点就是度为1的节点,再加上左右子树中度为1的节点个数就是这棵子树中度为1的节点个数。其他情况下,左右子树中度为1的节点个数之和就是这棵二叉树中度为1的节点个数。

第7章\实例7-07.cpp
/********************************************
*实例说明:求度为1和度为0的节点个数
*********************************************/
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include<iostream.h>
#define MAXSIZE 100
typedef char DataType;
typedef struct Node
{
    DataType data;
    struct Node   * lchild,*rchild;
}BitNode,*BiTree;
void TreePrint(BiTree T,int level);
BiTree CreateBitTree();
int Degrees1(BitNode *T);
int Degrees0(BitNode *T);
BiTree CreateBitTree()
/*利用先序输入方式创建二叉树*/
{
    DataType ch;
    BiTree bt;
    scanf("%c",&ch);
    if(ch=='#')
        bt=NULL;
    else
    {
        bt=(BitNode*)malloc(sizeof(BitNode));
        bt->data=ch;
        bt->lchild=CreateBitTree();
        bt->rchild=CreateBitTree();
    }
    return bt;
}
int Degrees1(BitNode *T)
//求二叉树中度为1的节点个数
{
    if(T==NULL)                   //空二叉树
        return 0;                 //度为1的节点个数为0
    if(T->lchild!=NULL && T->rchild==NULL || T->lchild==NULL && T->rchild!=NULL) 
    //若只有左子树或右子树
        return 1 + Degrees1(T->lchild) + Degrees1(T->rchild);
    //则该节点的度为1,求左子树和右子树中度为1的节点个数之和
    return  Degrees1(T->lchild) + Degrees1(T->rchild);//其他情况下求左右子树中度为1的节点
    //个数之和
}
int Degrees0(BiTree T)
/*求二叉树中度为0的节点个数*/
{
    if(!T)                           /*如果二叉树是空二叉树,返回0*/
        return 0;
    else
        if(!T->lchild&&!T->rchild)   /*如果左子树和右子树都已空,返回1*/
            return 1;
        else
            return Degrees0(T->lchild)+Degrees0(T->rchild);     /*把左子树的叶子节点个数  
            与右子树的叶子节点个数相加*/
}
void TreePrint(BiTree T,int level)
/*按树状输出的二叉树*/
{
    int i;
    if(T==NULL)                      /*如果指针已空,返回上一层*/
        return;
    TreePrint(T->rchild,level+1);    /*输出右子树,并将层次加1*/
    for(i=0;i<level;i++)             /*按照递归的层次输出空格*/
        cout<<"   ";
    cout<<T->data<<endl;             /*输出根节点*/
    TreePrint(T->lchild,level+1);    /*输出左子树,并将层次加1*/
}
void main()
{
    BiTree T;
    cout<<"请按照先序方式输入二叉树的节点:"<<endl;
    T=CreateBitTree();
    cout<<"创建的二叉树:"<<endl;
    TreePrint(T,1);
    cout<<"度为0的节点个数:"<<Degrees0(T)<<endl;
    cout<<"度为1的节点个数:"<<Degrees1(T)<<endl;
}

运行结果如图7.26所示。

205.png

图7.26 运行结果