要实现任意一种数据结构,首先要考虑组成该数据结构的基本元素。
二叉树的基本组成元素是结点;又根据二叉树的性质,每个结点都可以看成由数据项、指向左子树的指针和指向右子树的指针组成。
二叉树的操作要充分考虑递归的运用。
#include <stdio.h>
#include <stdlib.h>
//二叉树的数据结构
typedef struct {
char data;
struct BNode *LTree,*RTree;
}BNode,*BTree;
//二叉树的初始化
void InitBTree(BTree *T){
*T=NULL;
}
//二叉树的建立
void CreateBTree(BTree *T){
char ch;
scanf("%c",&ch);
if('#'==ch){
*T=NULL;
}else{
*T=(BTree)malloc(sizeof(BNode));
if(!(*T)){
exit(-1);//内存分配失败!
}
(*T)->data=ch;
CreateBTree(&((*T)->LTree));
CreateBTree(&((*T)->RTree));
}
}
//二叉树的遍历
/*前序遍历*/
void PreOrder(BTree T){
if(T){
printf("%c ",T->data);
PreOrder(T->LTree);
PreOrder(T->RTree);
}
}
/*中序遍历*/
void MidOrder(BTree T){
if(T){
MidOrder(T->LTree);
printf("%c ",T->data);
MidOrder(T->RTree);
}
}
/*后序遍历*/
void LastOrder(BTree T){
if(T){
LastOrder(T->LTree);
LastOrder(T->RTree);
printf("%c ",T->data);
}
}
/*获取二叉树的深度:递归的思想很重要!*/
int TreeDepth(BTree T){
int LDepth,RDepth,TDepth;
if(T){
LDepth=TreeDepth(T->LTree);
RDepth=TreeDepth(T->RTree);
TDepth=(LDepth>RDepth)?LDepth:RDepth;
return (TDepth+1);
}else
return 0;
}
/*打印根结点*/
void PrintRoot(BTree T){
printf("%c",T->data);
}
int main(){
BTree T;
InitBTree(&T);
CreateBTree(&T);
printf("前序遍历为:\n");
PreOrder(T);
printf("\n中序遍历为:\n");
MidOrder(T);
printf("\n后序遍历为:\n");
LastOrder(T);
printf("\n树的深度为:%d\n",TreeDepth(T));
return 0;
}
如何打印树的形状?