通过先序递归遍历创建。
先序,后序,中序遍历的递归算法打印
#define MAXSIZE 100
#include <stdio.h>
#include<cstdlib>
typedef struct {
int data;
char c;
}Telemtype;
typedef struct Binode{
Telemtype data;
Binode* lchild, * rchilid;
}Binode,*BiTree;
void precreateTREE(BiTree& T);
void Inorder(BiTree T);
void InitTree(BiTree& T);
void PreOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
void select(BiTree T);
int main() {
BiTree T;
//InitTree(T);
InitTree(T);
precreateTREE(T);
select(T);
return 0;
}
void InitTree(BiTree& T) {
T=new Binode;
T->lchild = NULL;
T->rchilid = NULL;
}
//先序遍历创建树
void precreateTREE(BiTree& T) {
int x;
scanf_s("%d", &x);
if (x == 0) { //当输入0时,结束
T = NULL;
return;
}
else {
T = (BiTree)malloc(sizeof(Binode));
T->data.data =x;
printf("please input the %d's lchild\n", x);
precreateTREE(T->lchild);
printf("please input the %d's rchild\n", x);
precreateTREE(T->rchilid);
}
}
//中序遍历递归算法输出树
void Inorder(BiTree T) {
if (T != NULL) {
Inorder(T->lchild);
printf("%d", T->data.data);
Inorder(T->rchilid);
}
}
void PreOrderTraverse(BiTree T)
{
//递归先序遍历
if (T != NULL)
{
printf("%d", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchilid);
}
}
void PostOrderTraverse(BiTree T)
{
//递归后序遍历
if (T != NULL)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchilid);
printf("%d", T->data);
}
}
void select(BiTree T) {
int x = 0;
do{
printf("请输入:>");
scanf_s("%d", &x);
switch (x) {
case 1:
printf("先序遍历\n");
PreOrderTraverse(T);
break;
case 2:
printf("中序遍历\n");
Inorder(T);
break;
case 3:
printf("后序遍历\n");
PostOrderTraverse(T);
break;
}
} while (x);
}
对于T->data.data和T->data,按理来说应该用前者,但是在运行过程中,一开始用前者结构是错的,后来又改成后者。在三次打印中,这两个都用到了,最后的结果也是正确的。总之就是很奇怪。