对于树来说我们基本的操作有统计它叶子的个数,还可以统计结点个数,以及每一层结点的个数:
首先,求叶子的个数,我们通过递归遍历的方法来实现:
int getleaf(tree_node t) //求叶子数 { int a,b; if(t==NULL) //判断是否为空 return 0; else { if(t->lchild==NULL&&t->rchild==NULL) //只有一个根节点 return 1; else { a=getleaf(t->lchild); b=getleaf(t->rchild); return a+b; //返回叶子结点数 } } }接下来我们统计每一层节点的个数:
void getlevel(tree_node t,int l,int num[]) //求二叉树每层节点的个数 { if(t) { num[l]++; getlevel(t->lchild,l+1,num); getlevel(t->rchild,l+1,num); } }既然知道了每一层结点的个数,那我们便可得知所有结点的个数:
for(i=1; i<=height; i++) a=a+num[i];
int getheight(tree_node t) { int h1,h2; if(t==NULL) //判断是否为空 return 0; else { h1=getheight(t->lchild); h2=getheight(t->rchild); //比较左右子树,得树的深度 if(h1>h2) return h1+1; else return h2+1; } }完整的程序如下:
#include<cstdio> #include<cstdlib> #include<iostream> #include<stack> #include<new> using namespace std; typedef struct TREE_NODE { char data; struct TREE_NODE *lchild; struct TREE_NODE *rchild; }*tree_node; tree_node createTree() //树的建立 { char ch; tree_node t; ch=getchar(); //输入二叉树数据 if(ch=='#') //判断二叉树是否为空 t=NULL; else { t=(tree_node)malloc(sizeof(tree_node)); //二叉树的生成 t->data=ch; t->lchild=createTree(); t->rchild=createTree(); } return t; } int getleaf(tree_node t) //求叶子数 { int a,b; if(t==NULL) //判断是否为空 return 0; else { if(t->lchild==NULL&&t->rchild==NULL) //只有一个根节点 return 1; else { a=getleaf(t->lchild); b=getleaf(t->rchild); return a+b; //返回叶子结点数 } } } void getlevel(tree_node t,int l,int num[]) //求二叉树每层节点的个数 { if(t) { num[l]++; getlevel(t->lchild,l+1,num); getlevel(t->rchild,l+1,num); } } int getheight(tree_node t) { int h1,h2; if(t==NULL) //判断是否为空 return 0; else { h1=getheight(t->lchild); h2=getheight(t->rchild); //比较左右子树,得树的深度 if(h1>h2) return h1+1; else return h2+1; } } int main() { int num[10]= {0}; int height; int i,a=0; tree_node t; t=createTree(); height=getheight( t) ; getlevel(t,1,num); for(i=1; i<=height; i++) a=a+num[i]; printf("结点个数:%d\n",a); printf("叶子总数:%d\n",getleaf(t)); }
原文地址:http://blog.csdn.net/fk5431/article/details/45584581