先感叹:好久好久没有来CSDN更新了,只是大一的时候在CSDN比较活跃,后来就很少上了,现在都研二了,时间过的好快,以后尽力常来逛逛,然后更新下。
现在研二的第二学期已经开始了,因为学院规定我们研二的要给老师当助教,根据往年的经验,我就是给我们老板当课程《数据结构》的助教,其中最重要的工作就是代替老师给学生带数据结构的实习。想想数据结构已经忘记的也差不多了,想想毕业找工作的时候估计也能用上,就想乘着这个时候把数据结构再捡起来,然后从学习室捣腾了一本程杰的《大话数据结构》来看。下面的代码是我看到二叉树的地方的时候写的一些代码,代码实现平台是Visual Studio 2012,编程语言为C。
// 二叉树建立和遍历.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
//下面三个个变量定义是为了在扩展的后序递归创建二叉树中子递归也能访问到输入的后序字符序列
char string[100];
int len;
int flag=1;//该标识符是为了只在第一次调用后序创建二叉树的时候提示输入后序字符序列,而子递归不用。
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//按照先序遍历的顺序进行树的建立结点为空用#表示,如AB#D##C##表示BC分别为根结点A的左右孩子结点,D为B的右孩子
void preCreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=(BiTree) malloc(sizeof(BiTNode));
if(!T)
exit(EXIT_FAILURE);
T->data=ch;
preCreateBiTree(T->lchild);
preCreateBiTree(T->rchild);
}
}
//由于中序和后序遍历不能首先建立根结点,用加’#‘的方法是不可能创建一个二叉树的。但是因为后序输入中可以肯定的是最后一个输入的结点肯定是数的根结点,
//所以可以根据这一点进行扩展形成后序递归创建二叉树,但是不能像先序一样一边输入一边构建,而是先用一个字符数组将完整的后序序列保存下来,然后从最后
//一位开始向前构建,代码如下:
void postCreateBiTree(BiTree &T)
{
if(flag==1)
{
scanf("%s",string);//读入完整后序遍历序列,用’#‘代表空结点
len=strlen(string);
flag=0;
}
if(string[--len]=='#')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(EXIT_FAILURE);
//因为使从后面向前读取字符,又因为后序是左右中,所以正确顺序是中右左
T->data=string[len];
postCreateBiTree(T->rchild);
postCreateBiTree(T->lchild);
}
}
//先序递归遍历
void preOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c",T->data);
preOrderTraverse(T->lchild);
preOrderTraverse(T->rchild);
}
//中序递归遍历
void inOrderTraverse(BiTree T)
{
if(T==NULL)
return;
inOrderTraverse(T->lchild);
printf("%c",T->data);
inOrderTraverse(T->rchild);
}
//后序递归遍历
void postOrderTraverse(BiTree T)
{
if(T==NULL)
return;
postOrderTraverse(T->lchild);
postOrderTraverse(T->rchild);
printf("%c",T->data);
}
int _tmain(int argc, _TCHAR* argv[])
{
BiTree T;
printf("%s","请输入先序序列\n");
preCreateBiTree(T);
printf("%s","新建立的树的先序遍历为:");
preOrderTraverse(T);
puts("");//简单输出换行
printf("%s","新建立的树的中序遍历为:");
inOrderTraverse(T);
puts("");
printf("%s","新建立的树的后序遍历为:");
postOrderTraverse(T);
puts("");
printf("%s","请输入后序序列\n");
postCreateBiTree(T);
printf("%s","新建立的树的先序遍历为:");
preOrderTraverse(T);
puts("");
printf("%s","新建立的树的中序遍历为:");
inOrderTraverse(T);
puts("");
printf("%s","新建立的树的后序遍历为:");
postOrderTraverse(T);
puts("");
return 0;
}
运行结果为: