题目
用二叉链表来储存二叉树,,实现二叉树党的建树(通过键盘输入)、先序遍历、中序遍历、后序遍历、销毁5个操作。编制 主程序main()这些函数,并输出各遍历结果。
代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct BiNode {
char data;
struct BiNode *lchild,*rlchild;
} BiNode,*BiTree;
void CreateTree(BiTree &T);
void PreOrder(BiTree T);
void InOrder(BiTree T);
void PostOrder(BiTree T);
void Destory(BiTree T);
int main() {
BiTree T;
printf("请先以先序遍历方式输入二叉树\n");
CreateTree(T);
printf("先序遍历序列");
PreOrder(T);
printf("\n中序遍历序列");
InOrder(T);
printf("\n后序遍历序列");
PostOrder(T);
return 0;
}
void CreateTree(BiTree &T) {
char ch;
scanf("%c",&ch);
if(ch == '#')//很关键,记得输入来终止递归
T = NULL;
else {
if(!(T= (BiNode*) malloc(sizeof(BiNode))))
return;
T->data = ch;
CreateTree(T->lchild);
CreateTree(T->rlchild);
}
}
void Visted(char ch) {
printf("%c",ch);
}
void PreOrder(BiTree T) {
if(T) {
Visted(T->data);
PreOrder(T->lchild);
PreOrder(T->rlchild);
}
}
void InOrder(BiTree T) {
if(T) {
InOrder(T->lchild);
Visted(T->data);
InOrder(T->rlchild);
}
}
void PostOrder(BiTree T) {
if(T) {
PostOrder(T->lchild);
PostOrder(T->rlchild);
Visted(T->data);
}
}
void Destory(BiTree T) {
if(T) {
Destory(T->lchild);
Destory(T->rlchild);
free(T);
}
}
结果
感悟
!!! 我们在输入树的内部数据时,需要使用特殊符号先将树补充为完全二叉树,即所有节点都必须有两个子节点,单个节点也需要补