二叉树的高度用递归的方式求解,二叉树的树形显示利用其对应满二叉树的位置输出。
代码:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
typedef struct BinTreeNode * BinTree;
typedef struct BinTreeNode
{
char data;
BinTree lChild,rChild;
} BinTreeNode;
int max(int a,int b)
{
return a>b?a:b;
}
void BuildBinTree(BinTree *T)
{
char item;
cin>>item;
if(item=='#')
{
*T = NULL;
}
else {
*T = new BinTreeNode;
(*T)->data = item;
BuildBinTree(&((*T)->lChild));
BuildBinTree(&((*T)->rChild));
}
}
int Height(BinTree T)
{
if (!T)
return 0;
return 1 + max(Height(T->lChild),Height(T->rChild));
}
void DestroyBinTree(BinTree *T)
{
if(*T)
{
DestroyBinTree(&((*T)->lChild));
DestroyBinTree(&((*T)->rChild));
delete (*T);
*T = NULL;
}
}
void ShowTreeMarker(int **m,int row,int col,char *s)
{
int cnt = 0;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(m[i][j])
cout<<setw(2)<<s[cnt++];
else
cout<<setw(2)<<' ';
}
cout<<endl;
}
}
void MatCreate(int *c,int **m,int level)
{
int i,j;
int start,step;
int len = (1<<level) - 1;
m[0][len>>1] = 1;
int d = len;
int cnt = 0;
for(i=1;i<level;i++)
{
//the (i-1)th row
d = d>>1;
start = (d>>1);
// if (c[++cnt])
// m[i][start] = 1;
for(j=1;j<=(1<<i);j++)
if(c[++cnt])
m[i][start+(d+1)*(j-1)] = 1;
}
}
void Pave(BinTree T,int *c,int start)
{
if(T)
{
c[start] = 1;
Pave(T->lChild, c, 2 * start + 1);
Pave(T->rChild, c, 2 * start + 2);
}
}
int main()
{
BinTree T = NULL;
BuildBinTree(&T);
int h = Height(T);
int len = (1<<h) - 1;
int *c = new int[len];
memset(c,0,len*sizeof(int));
Pave(T,c,0);
for(int i = 0; i < len; i++)
cout<<c[i]<<" ";
cout<<endl;
cout<<"Height of BinTree : "<<h<<endl;
cout<<(1<<h) - 1<<endl;
int **m = new int*[h];
for(int i= 0;i<h;i++){
m[i] = new int[len];
memset(m[i],0,len*sizeof(int));
}
MatCreate(c,m,h);
for(int i=0;i<h;i++)
{
for(int j=0;j<len;j++)
cout<<setw(2)<<m[i][j];
cout<<endl;
}
ShowTreeMarker(m,h,len,"ABCDEFGHIJK");
DestroyBinTree(&T);
}
测试输入:
ABD##E##CF###
测试输出:
1 1 1 1 1 1 0
Height of BinTree : 3
7
0 0 0 1 0 0 0
0 1 0 0 0 1 0
1 0 1 0 1 0 0
A
B C
D E F