二叉树的二叉链表存储结构

本文介绍了二叉树的二叉链表存储结构,并通过递归函数展示了先序、中序、后序遍历以及层序遍历等操作。此外,还包括结点值的修改、查找结点关系以及插入和删除子树等二叉树的基本操作。
摘要由CSDN通过智能技术生成
// c6-2.h 二叉树的二叉链表存储结构(见图6.7)
typedef struct BiTNode
{
	TElemType data;
	BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;
二叉树的二叉链表存储结构删除和插入结点或子树都很灵活。结点动态生成,可充分
利用存储空间。图68是图61(a)所示二叉树的二叉链表存储结构。bo6-2.cpp是二叉链
表存储结构的基本操作,其中,调用按先序次序构造二叉链表的函数CreateBiTree()(算法
6.4)时,不仅要按先序次序输入结点的值,而且还要把叶子结点的左右孩子指针和度为1
的结点的空指针输入。其原因是只根据结点的先序次序还不能惟一确定树的形状。如图
69所示,三棵树的先序次序都是abc。这样,在调用函数CreateBiTree()时,输入abc就会

产生多义性。如果把叶子结点的左右孩子指针和度为1的结点的空指针也按先序输入,则

图69(a)输入字符的次序为(以^代替结点的空指针)abc^^^^;图69(b)输入字符的次序
为ab^^c^^;图69(c)输入字符的次序为a^b^c^^。


bo6-2.cpp 中的许多基本操作都采用了递归函数,因为二叉树的层数是不定的,正确
采用递归函数可简化编程。注意到这些递归函数的特点:第1 是降阶的;第2 是有出
口的。
在bo6-2.cpp 和main6-2.cpp 中,采用了编译预处理的“#define”、“#ifdef”等命令,
通过把main6-2.cpp 的第2 行或第3 行设为注释行,使程序可以在结点类型为整型或字符
型的情况下应用。

// func6-3.cpp bo6-2.cpp和func9-1.cpp调用
void InitBiTree(BiTree &T)
{ // 操作结果:构造空二叉树T(见图6.10)
	T=NULL;
}
void DestroyBiTree(BiTree &T)
{ // 初始条件:二叉树T存在。操作结果:销毁二叉树T(见图6.10)
	if(T) // 非空树
	{
		if(T->lchild) // 有左孩子
			DestroyBiTree(T->lchild); // 销毁左孩子子树
		if(T->rchild) // 有右孩子
			DestroyBiTree(T->rchild); // 销毁右孩子子树
		free(T); // 释放根结点
		T=NULL; // 空指针赋0
	}
}
void PreOrderTraverse(BiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。算法6.1,有改动
	// 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
	if(T) // T不空
	{
		Visit(T->data); // 先访问根结点
		PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
		PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
	}
}
void InOrderTraverse(BiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
	// 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
	if(T)
	{
		InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
		Visit(T->data); // 再访问根结点
		InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值