//创建树
Bitree CreatBitree(){
Bitree T;
char c;
scanf("%c",&c);
if(c=='#'){
T=NULL;
}
else{
T=(Bitree)malloc(sizeof(BiNode));
T->data=c;
T->lchild= CreatBitree();
T->rchild= CreatBitree();
}
return T;
}
//遍历先序
void PreTraverse(Bitree T)
{if(T==NULL)
return;
printf("%c ",T->data);
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
//遍历中序
void InoderTraverse(Bitree T)
{
if(T==NULL)
return;
InoderTraverse(T->lchild);
printf("%c ",T->data);
InoderTraverse(T->rchild);
}
//遍历后序
void PostTraverse(Bitree T){
if(T==NULL)
return;
PostTraverse(T->lchild);
PostTraverse(T->rchild);
printf("%c ",T->data);
}
非递归比较难,需要自己画图去理解。尤其是非递归的后序。
//非递归先序
void PreTraverse2(Bitree T){
Bitree stack[Maxsize],node;
int top=-1;
if(T==NULL)return;
else{
top++;
stack[top]=T;
while(top>-1){
node=stack[top--];
printf("%c ",node->data);
if(node->rchild!=NULL){
stack[++top]=node->rchild;
}
if(node->lchild!=NULL){
stack[++top]=node->lchild;
}}
}
}
//非递归中序
void InoderTraverse2(Bitree T){
Bitree stack[Maxsize],node;
int top=-1;
if(T==NULL){
printf("kong");
return;
}
node=T;
while(node!=NULL||top>-1){
while (node != NULL){
stack[++top]=node;
node = node->lchild;
}
node=stack[top--];
printf("%c ",node->data);
node=node->rchild;
}
}
//非递归后序
void PostTraverse2(Bitree T){
Bitree stack[Maxsize],node;
node=T;
int top= 0;
Bitree have_visited = NULL;
while (NULL != node || top>0)
{
while (NULL != node)
{
stack[top++] = node;
node=node->lchild;
}
node = stack[top-1];
if (NULL == node->rchild || have_visited == node->rchild)
{
printf("%c ", node->data);
top--;
have_visited = node;
node= NULL;
}
else
{
node= node->rchild;
}
}
}
//树的高度
int Treeheigh(Bitree T){
if(T==NULL){
return 0;
}
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else{
return Treeheigh(T->lchild) > Treeheigh(T->rchild) ? Treeheigh(T->lchild) + 1 : Treeheigh(T->rchild) + 1;
}
}
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define Maxsize 100
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*Bitree;
Bitree CreatBitree(){
Bitree T;
char c;
scanf("%c",&c);
if(c=='#'){
T=NULL;
}
else{
T=(Bitree)malloc(sizeof(BiNode));
T->data=c;
T->lchild= CreatBitree();
T->rchild= CreatBitree();
}
return T;
}
//遍历先序
void PreTraverse(Bitree T)
{if(T==NULL)
return;
printf("%c ",T->data);
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
//遍历中序
void InoderTraverse(Bitree T)
{
if(T==NULL)
return;
InoderTraverse(T->lchild);
printf("%c ",T->data);
InoderTraverse(T->rchild);
}
int Treeheigh(Bitree T){
if(T==NULL){
return 0;
}
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else{
return Treeheigh(T->lchild) > Treeheigh(T->rchild) ? Treeheigh(T->lchild) + 1 : Treeheigh(T->rchild) + 1;
}
}
//遍历后序
void PostTraverse(Bitree T){
if(T==NULL)
return;
PostTraverse(T->lchild);
PostTraverse(T->rchild);
printf("%c ",T->data);
}
//非递归前序
void PreTraverse2(Bitree T){
Bitree stack[Maxsize],node;
int top=-1;
if(T==NULL)return;
else{
top++;
stack[top]=T;
while(top>-1){
node=stack[top--];
printf("%c ",node->data);
if(node->rchild!=NULL){
stack[++top]=node->rchild;
}
if(node->lchild!=NULL){
stack[++top]=node->lchild;
}}
}
}
//非递归中序
void InoderTraverse2(Bitree T){
Bitree stack[Maxsize],node;
int top=-1;
if(T==NULL){
printf("kong");
return;
}
node=T;
while(node!=NULL||top>-1){
while (node != NULL){
stack[++top]=node;
node = node->lchild;
}
node=stack[top--];
printf("%c ",node->data);
node=node->rchild;
}
}
//非递归后序
void PostTraverse2(Bitree T){
Bitree stack[Maxsize],node;
node=T;
int top= 0;
Bitree have_visited = NULL;
while (NULL != node || top>0)
{
while (NULL != node)
{
stack[top++] = node;
node=node->lchild;
}
node = stack[top-1];
if (NULL == node->rchild || have_visited == node->rchild)
{
printf("%c ", node->data);
top--;
have_visited = node;
node= NULL;
}
else
{
node= node->rchild;
}
}
}
int main(){
Bitree T;
T=CreatBitree();
printf("遍历先序:\n");
PreTraverse(T);
printf("\n");
printf("遍历中序:\n");
InoderTraverse(T);
printf("\n");
printf("遍历后序:\n");
PostTraverse(T);
printf("\n");
printf("非递归先序\n");
PreTraverse2(T);
printf("\n");
printf("非递归中序\n");
InoderTraverse2(T);
printf("\n");
printf("非递归后序\n");
PostTraverse2(T);
printf("\n");
printf("%d",Treeheigh(T));
return 0;
}