这是我第一次写博文,代码很多也是参考书本和别人的。目前学习到二叉树部分。仅在此个人纪录一下,方便复习。
首先是定义。
typedef struct BiNode
{
char data;
struct BiNode *lchild;
struct BiNode *rchild;
}BiNode,*BiTree;
然后是 创建二叉树,用的是递推。
void creatTree(BiTree *T)
{
printf("请输入:");
char ch;
ch=getchar();
if(ch=='#')(*T)=NULL;//#代表空指针,本人基础不好,在ch=='#'写成了ch='#',找bug找了好久
else
{
(*T)=(BiTree)malloc(sizeof(BiNode));//申请空间
(*T)->data=ch;//生成根结点
creatTree(&(*T)->lchild);
creatTree(&(*T)->rchild);
}
}
接着是先序,中序,后序遍历。大致是相同的。
void preorder(BiTree T)
{
if(T)//此处if我一开始没有套{},因此没有任何输出,低级错误
{
printf("%2c\n",T->data);
preorder(T->lchild);
preorder(T->rchild);
}
}
void inorder(BiTree T)
{
if(T)
{
inorder(T->lchild);
printf("%2c\n",T->data);
inorder(T->rchild);
}
}
void postorder(BiTree T)
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
printf("%2c\n",T->data);
}
}
层次遍历。我没有在开头建队列,而是在函数内自己弄了一个队列,出了这个函数就用不了了。
void levelorder(BiTree T)
{
BiTree Queue[max],b;//用一维数组表示队列,front头,rear尾
int rear,front;
rear=front=0;
if(T)//若树不为空
{
Queue[rear++]=T;//根结点入队列,记住是rear++而不是rear,这是队列的特性
while(front!=rear)//当队列非空
{
b=Queue[front++];//队首元素出队列,并访问这个结点。我的理解是队头在它入队这一轮遍历不应出队,而是要到下一轮遍历才出队,于是是front++
printf("%2c\n",b->data);
if(b->lchild!=NULL)Queue[rear++]=b->lchild;
if(b->rchild!=NULL)Queue[rear++]=b->rchild;
}
}
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#define max 20
typedef struct BiNode
{
char data;
struct BiNode *lchild;
struct BiNode *rchild;
}BiNode,*BiTree;
void creatTree(BiTree *T)
{
printf("请输入:");
char ch;
ch=getchar();
if(ch=='#')(*T)=NULL;
else
{
(*T)=(BiTree)malloc(sizeof(BiNode));
(*T)->data=ch;
creatTree(&(*T)->lchild);
creatTree(&(*T)->rchild);
}
}
void preorder(BiTree T)
{
if(T)
{
printf("%2c\n",T->data);
preorder(T->lchild);
preorder(T->rchild);
}
}
void inorder(BiTree T)
{
if(T)
{
inorder(T->lchild);
printf("%2c\n",T->data);
inorder(T->rchild);
}
}
void postorder(BiTree T)
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
printf("%2c\n",T->data);
}
}
void levelorder(BiTree T)
{
BiTree Queue[max],b;
int rear,front;
rear=front=0;
if(T)
{
Queue[rear++]=T;
while(front!=rear)
{
b=Queue[front++];
printf("%2c\n",b->data);
if(b->lchild!=NULL)Queue[rear++]=b->lchild;
if(b->rchild!=NULL)Queue[rear++]=b->rchild;
}
}
}
int main()
{
BiTree T=NULL;
printf("创建二叉树");
creatTree(&T);
printf("先序遍历二叉树");
preorder(T);
printf("中序遍历二叉树");
inorder(T);
printf("后序遍历二叉树");
postorder(T);
printf("层次遍历二叉树");
levelorder(T);
}
以后可能还会发输出所有叶子结点路径,二叉树查找插入删除,有空再说吧。