题目内容
构造一颗二叉树,输出其先序、中序、后序遍历序列。
个人解法
#include <stdio.h>
#include <stdlib.h>
#define Overflow -1
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *LChild, *RChild;
} BiTNode, *BiTree;
//创建二叉树(先序遍历)
void CreateBiTree(BiTree &T) //构造二叉链表表示的二叉树T
{
char ch;
scanf("%c", &ch); //按扩展先序次序输入二叉树中结点的值(一个字符)
if (ch == '#') //‘#’字符表示空树
T = NULL; //递归结束,建空树
else
{
if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
exit(Overflow);
T->data = ch; //生成根结点
CreateBiTree(T->LChild); //构造左子树,并设置T的左孩子指针
CreateBiTree(T->RChild); //构造右子树,并设置T的右孩子指针
}
}
//统计二叉树结点总数
int NodeCount(BiTree T)
{
if (!T) //空树
return 0;
else //结点总数 = 左子树结点数 + 右子树结点数 + 根
return NodeCount(T->LChild) + NodeCount(T->RChild) + 1;
}
//统计二叉树叶子结点数
int LeafCount(BiTree T)
{
if (!T) //不存在根结点
return 0;
if (T->LChild == NULL && T->RChild == NULL) //只有根结点
return 1;
else //叶子结点数 = 左子树叶子结点数 + 右子树叶子结点数
return LeafCount(T->LChild) + LeafCount(T->RChild);
return 0;
}
//计算二叉树深度
int Depth(BiTree T)
{
int LDepth, RDepth;
if (!T)
return 0;
else
{
LDepth = Depth(T->LChild);
RDepth = Depth(T->RChild);
return LDepth > RDepth ? LDepth : RDepth + 1;
}
}
//先序遍历
void PreOrderTraverse(BiTree T)
{
if (T)
{
printf("%c", T->data); //访问根结点
PreOrderTraverse(T->LChild); //递归遍历左子树
PreOrderTraverse(T->RChild); //递归遍历右子树
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->LChild); //递归遍历左子树
printf("%c", T->data); //访问根结点
InOrderTraverse(T->RChild); //递归遍历右子树
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if (T)
{
PostOrderTraverse(T->LChild); //递归遍历左子树
PostOrderTraverse(T->RChild); //递归遍历右子树
printf("%c", T->data); //访问根结点
}
}
int main()
{
BiTree T;
printf("请依次输入二叉树结点值,并用#表示空树:\n");
CreateBiTree(T);
if (T)
{
printf("\n先序遍历:\n");
PreOrderTraverse(T);
printf("\n中序遍历:\n");
InOrderTraverse(T);
printf("\n后序遍历:\n");
PostOrderTraverse(T);
}
else
printf("创建失败!");
return 0;
}
运行结果
本人拙作,请大佬们点评。