一个二叉树的繁茂度定义为各层节点数的最大值与树的高度的乘积。是写个算法,求二叉树的繁茂度。
其实就是找出结点数最多的那一层,然后结点数乘以树的高度
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
#define maxn 30
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void visit(bitree p)
{
printf("%c ", p->data);
}
void creattree(bitree &bt)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')
bt=NULL;
else
{
bt=(tnode *)malloc(sizeof(tnode));
bt->data=ch;
printf("输入%c的左子节点:", ch);
creattree(bt->lchild);
printf("输入%c的右子节点:", ch);
creattree(bt->rchild);
}
}
int high(bitree t) //求树的高度
{
int l,r,h;
if(t)
{
l=high(t->lchild);
r=high(t->rchild);
h=(l > r ? l : r)+1;
}
else
h=0;
return h;
}
int tree(bitree &t) //利用两个栈轮流存放一层的结点
{
int h,a[maxn],i,k;
bitree p;
p=t;
stack<struct tnode*>s1;
stack<struct tnode*>s2;
memset(a,0,sizeof(a));
h=high(t);
if(p)s1.push(p);
else return 0;
for(i=0;i<h;i++)
{
if(!s1.empty()&&s2.empty())
{
while(!s1.empty()) //s1存放的当前第i层的结点全部取出
{
p=s1.top();
s1.pop();
a[i]++;
if(p->lchild)s2.push(p->lchild); //将第i+1层全部进s2的栈
if(p->rchild)s2.push(p->rchild);
}
}
else
{
if(s1.empty()&&!s2.empty()) //s2存放的当前第i层的结点全部取出
{
while(!s2.empty())
{
p=s2.top();
s2.pop();
a[i]++;
if(p->lchild)s1.push(p->lchild); //将第i+1层全部进s1的栈
if(p->rchild)s1.push(p->rchild);
}
}
}
}
sort(a,a+h);
k=a[h-1];
return h*k;
}
int main()
{
bitree bt;
int k;
bt=(tnode*)malloc(sizeof(tnode));
printf("输入根节点:");
creattree(bt);
k=tree(bt);
printf("%d",k);
return 0;
}