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;
}
实例


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

被折叠的 条评论
为什么被折叠?



