遍历二叉树(递归)

本文详细介绍了二叉树的遍历算法,包括前序、中序、后序及层序遍历,并提供了C++实现代码。通过递归方式实现了二叉树的创建、遍历和销毁,为读者深入理解二叉树数据结构及其操作提供了实践指南。

6.3.1遍历二叉树

子函数

BiTree.h

// - - - - -  二叉树的二叉链表存储表示 - - - - -
typedef char TElemType;
typedef bool Status;
typedef struct BiTNode {
	TElemType data;
	struct BiTNode* lchild, * rchild;//左右孩子指针
}BiTNode, * BiTree;

// - - - - - 基本操作的函数原型说明(部分) - - - - -
Status InitBiTree(BiTree& T);
//初始化,构造空二叉树T
Status DestroyBiTree(BiTree& T);
//若二叉树T存在,按后序次序销毁二叉树T
Status CreateBiTree(BiTree& T);
//按先序次序输入二叉树中结点的值(一个字符),@字符表示空树
//构造二叉链表表示的二叉树T
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e));
//采用二叉链表存储结构,Visit是对结点操作的应用函数
//先序遍历二叉树T,对每个结点调用Visit函数一次且仅一次
//一旦visit()失败,则操作失败
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e));
//中序遍历二叉树T
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType e));
//后序遍历二叉树T
Status LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType e));
//层序遍历二叉树T(未定义)

// - - - - - 基本操作的算法描述(部分) - - - - -
Status InitBiTree(BiTree& T) {
	T = NULL; return true;
}

Status DestroyBiTree(BiTree& T) {
	if (T) {
		if (DestroyBiTree(T->lchild))
			if (DestroyBiTree(T->rchild)) {
				free(T); T = NULL; return true;
			}
		return false;
	}return true;
}

Status CreateBiTree(BiTree& T) {
	TElemType ch; std::cin >> ch;
	if (ch != '@') {
		if (!(T = (BiTNode*)malloc(sizeof(BiTNode))))
			exit(OVERFLOW);
		T->data = ch;						//生成根结点
		if (CreateBiTree(T->lchild))		//构造左子树
			if (CreateBiTree(T->rchild))	//构造右子树
				return true;
		return false;
	}
	T = NULL; return true;
}// CreateBiTree

Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) {
	if (T) {
		if (Visit(T->data))
			if (PreOrderTraverse(T->lchild, Visit))
				if (PreOrderTraverse(T->rchild, Visit)) return true;
		return false;
	}return true;
}// PreOrderTraverse

Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) {
	if (T) {
		if (InOrderTraverse(T->lchild, Visit)) {
			Visit(T->data);
			if (InOrderTraverse(T->rchild, Visit))
				return true;
		}
		return false;
	}return true;
}// InOrderTraverse

Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) {
	if (T) {
		if (PostOrderTraverse(T->lchild, Visit))
			if (PostOrderTraverse(T->rchild, Visit))
			{
				Visit(T->data); return true;
			}
		return false;
	}return true;
}// PostOrderTraverse

主函数

Project6.3.1BiTreeTraverse.cpp

#include <iostream>
#include "Bitree.h"
using namespace std;

Status PrintElement(TElemType e) {	//最简单的Visit函数
    static int count = 0;
    cout << e; count++;
    if (count % 20 == 0) cout << '\n';
    return true;
}

int main(){
    BiTree T;
    cout << "按先序次序建立二叉树(@字符表示空树):\n";
    CreateBiTree(T);
    cout << "按后序次序输出二叉树:\n";
    PostOrderTraverse(T, PrintElement);
    DestroyBiTree(T);
    return 0;
}

实例

测试测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值