课本 《数据结构(C语言版)(第2版)》 严蔚敏版
树结构的学习。
编译环境:DEV C++
文件格式为 cpp(c++文件类型),前者的引用函数,在 C 的情况下没完成。
实现:
二叉树的先序遍历创建,三种遍历方法,叶子节点的查询等。
参考 code:
#include <stdio.h>
#include <stdlib.h>
#define Shyazhut 0//条件启用求叶子节点的函数:0 不使用
const int MYDD = 1103;
typedef struct BiTNode {
char data;//节点数据域
struct BiTNode *lc, *rc;//节点左右孩子
} BiTNode, *BiTree;
void CreatBiTree(BiTree &T);
void InitBiTree(BiTree &T);
void PreorderTraversal(BiTree T);//先序遍历
void InOrderTraveres(BiTree T);//中序遍历
void PostTraversing(BiTree T);//后序遍历
int GetLeaves(BiTree T);//求叶子节点
int LeavesSum = 0;//全局变量叶子节点统计
int main() {
int i,n;
BiTree T;
InitBiTree(T);
CreatBiTree(T);
puts("\n先序遍历二叉树的结果:");
PreorderTraversal(T);
puts("\n\n中序遍历二叉树的结果:");
InOrderTraveres(T);
puts("\n\n后序遍历二叉树的结果:");
PostTraversing(T);
printf("\n\n叶子节点的个数有 %d 个(先序遍历中求得).\n", LeavesSum);
#if Shyazhut
printf("叶子节点的个数有 %d 个(求叶子节点函数求得).\n", GetLeaves(T));
#endif
free(T);
return 0;
}
void InitBiTree(BiTree &T) {//节点初始化
T = (BiTNode*)malloc(sizeof(BiTNode));//malloc()的返回值可以强制类型转换
T -> lc = NULL;
T -> rc = NULL;
printf("请以先序的方式键入二叉树节点信息。\n");
}
void CreatBiTree(BiTree &T) {//先序遍历的方式构造二叉树
char ch;
scanf("%c", &ch);
if(ch == '#')
T = NULL;
else {
T=(BiTNode*)malloc(sizeof(BiTNode));
if(!T) return;
T -> data = ch;
CreatBiTree(T->lc);
CreatBiTree(T->rc);
}
}
/*三种遍历*/
void PreorderTraversal(BiTree T) {
if(T==NULL) return;
printf("%c ", T -> data);
if((T -> lc == NULL) && (T -> rc == NULL)) LeavesSum++;//叶子节点的统计
PreorderTraversal(T->lc);
PreorderTraversal(T->rc);
}
void InOrderTraveres(BiTree T) {
if(T == NULL) return;
InOrderTraveres(T -> lc);
printf("%c ", T -> data);
InOrderTraveres(T -> rc);
}
void PostTraversing(BiTree T) {
if(T == NULL) return;
PostTraversing(T -> lc);
PostTraversing(T -> rc);
printf("%c ", T -> data);
}
#if Shyazhut
int GetLeaves(BiTree T) {//叶子节点的统计
if(!T) {
LeavesSum += GetLeaves(T -> lc);
if((T -> lc == NULL) && (T -> rc == NULL)) LeavesSum++;
LeavesSum += GetLeaves(T -> rc);
}
return LeavesSum;
}
#endif
/*
测试数据
ABC##DE#G##F###
*/