#include <stdio.h>
#include <stdlib.h>
#define MAX_TREE_SIZE 100
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild; // 左右孩子指针
}btree, *BiTree;
void main()
{
// 先序次序输入构造二叉树
btree *CreateBiTree1(btree *T);
// 二叉树的先序遍历
void TreeFirst(btree *T);
// 二叉树的中序遍历
void TreeMiddle(btree *T);
// 二叉树的后序遍历
void TreeLast(btree *T);
// 定义
btree T;
btree *root; // 用于创建二叉树后返回指向二叉树根节点的指针,以便于遍历。否则创建完二叉树会丢失
root = CreateBiTree1(&T);
printf("Middle:\n");
TreeFirst(root);
printf("\nLeft:\n");
TreeMiddle(root);
printf("\nRight:\n");
TreeLast(root);
printf("\n");
}
// 先序构造次序输入二叉树
btree *CreateBiTree1(btree *T)
{
char temp;
// 输入数据
scanf("%c",&temp);
if(temp == '#')
T = NULL;
else
{
// 动态开辟内存空间
T = (btree *)malloc(sizeof(btree));
// 若申请分配空间失败则退出
if(!T)
exit(0);
T->data = temp;
T->lchild = CreateBiTree1(T->lchild);
T->rchild = CreateBiTree1(T->rchild);
}
return T;
}
// 二叉树的先序遍历
void TreeFirst(btree *T)
{
if(T)
{
printf("%c ",T->data);
TreeFirst(T->lchild);
TreeFirst(T->rchild);
}
}
// 二叉树的中序遍历
void TreeMiddle(btree *T)
{
if (T)
{
TreeMiddle(T->lchild);
printf("%c ",T->data);
TreeFirst(T->rchild);
}
}
// 二叉树的后序遍历
void TreeLast(btree *T)
{
if (T)
{
TreeFirst(T->lchild);
TreeFirst(T->rchild);
printf("%c ",T->data);
}
}
总结:
1、构建二叉树时用到递归调用要注意递归的入口点和出口点是什么
2、创建二叉树时要用返回根节点指针的函数,主函数用一个二叉树的指针来接收根节点的指针,否则创建后不能返回主函数会丢失。
3、递归时一定要注意也要用T->lchild = 子函数,T->rchild = 子函数。进行接收创建的左右子树的指针,函数的格式要与子函数一致有返回值
4、树的子函数是递归函数时一定要用返回指针的函数。否则会导致子树建立不全,丢失树叶,也不能进行递归。