严蔚敏 数据结构 二叉树链式存储结构 遍历等操作

本文主要介绍了严蔚敏《数据结构(C语言版)》中关于二叉树链式存储结构的内容,并在DEV C++环境下,用C++实现了二叉树的先序遍历创建以及三种遍历方法,同时讲解了如何查询叶子节点。代码可供参考。
摘要由CSDN通过智能技术生成


课本 《数据结构(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###


*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值