最近在做二叉树题目,所以总结一些比较简单的处理方法。
以下是输入的数据,#视为空
A##
ABC####
AB##C##
ABCD###EF##G###
A##B##
ABC##D##EG###
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstdlib>
char *ch;
typedef struct node
{
char data;
struct node *lc;
struct node *rc;
}BT,*Bi;
//二叉树的先序创建:百度到的基本都是在输入一个字符之后创建一个孩子节点,但是题目是多组输入,以下的代码是先将字符存在一个数组中,逐个取数,注:上面已经定义了全局变量字符ch。
void create(Bi &T)
{
if(*ch++=='#')
T=NULL;
else
{
T=(BT*)malloc(sizeof(BT));
T->data=*(ch-1);
create(T->lc);
create(T->rc);
}
}
//二叉树统计宽度:
int width(BT *t)
{
if(t->lc==NULL&&t->rc==NULL) return 1;
else
{
int l=0,r=0;
if(t->lc!=NULL) l=width(t->lc);
if(t->rc!=NULL) r=width(t->rc);
return l+r;
}
}
// 二叉树统计高度:
int heigh(BT *t)
{
int lc,rc;
if(t==NULL)
return 0;
else
{
lc=heigh(t->lc);
rc=heigh(t->rc);
return (lc>rc)?(lc+1):(rc+1);
}
}
//以下是遍历操作(非递归算法太麻烦了):
//二叉树的先序遍历:
void preorder(BT *t)
{
if(t!=NULL)
{
printf("%c",t->data);
preorder(t->lc);
preorder(t->rc);
}
}
//中序遍历:
void inorder(BT *t)
{
if(t!=NULL)
{
inorder(t->lc);
printf("%c",t->data);
inorder(t->rc);
}
}
//后序遍历:
void postorder(BT *t)
{
if(t!=NULL)
{
postorder(t->lc);
postorder(t->rc);
printf("%c",t->data);
}
}
//层次遍历:
void levelorder(BT *t)
{
BT *p;
BT *qu[1000];
int front,rear;
front=rear=-1;
rear++;
qu[rear]=t;
while(front!=rear)
{
front=(front+1)%1000;
p=qu[front];
printf("%c",p->data);
if(p->lc!=NULL)
{
rear=(rear+1)%1000;
qu[rear]=p->lc;
}
if(p->rc!=NULL)
{
rear=(rear+1)%1000;
qu[rear]=p->rc;
}
}
}
int main()
{
char str[100];
scanf("%s",str);
ch=str;
BT *t;
create(t);
printf("%d\n",width(t));
printf("%d\n", heigh(t));
preorder(t);
inorder(t);
postorder(t);
levelorder(t);
return 0;
}
注:遍历操作参考于:李春葆编著,数据结构教程.北京.清华大学出版社,2013.1