前序遍历规则:
若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。
中序遍历规则:
若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后访问根节点,最后中序遍历右子树。
后序遍历:
若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问右子树,最后访问根结点。
test.hpp
#ifndef TEST_H_
#define TEST_H_
#include<iostream>
#include"malloc.h"
#include<vector>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
//构造空树
BiTree * initTree();
//CreateTree(*T, definition) : 按definition中给出的定义来构造树
void createTree(BiTree * T);
//TreeDepth(T) : 返回T的深度
int treeDepth(BiTree T);
//二叉树的后序遍历算法
void PostOrderTraverse(BiTree T, const int level);
//二叉树的中序遍历
void InOrderTraverse(BiTree T, const int level);
//二叉树的前序遍历
void PreOrderTraverse(BiTree T, const int level);
//操作
void operatorPrint(BiTNode T, int level);
#endif // !TEST_H_
#pragma once
test.cpp
#include"test.h"
//InitTree(*T) :构造空树
BiTree * initTree() {
//BiTree * T = nullptr;
BiTree * T = (BiTree *)malloc(sizeof(BiTree));
return T;
}
//CreateTree(*T, definition) : 按definition中给出的定义来构造树
void createTree(BiTree * T) {
TElemType temp;
std::cin >> temp;
if (temp == '#')
*T = nullptr;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
exit(OVERFLOW);
(*T)->data = temp;
createTree(&(*T)->lchild);
createTree(&(*T)->rchild);
}
}
//TreeDepth(T) : 返回T的深度
int treeDepth(BiTree T) {
if (T != nullptr)
{
int left = treeDepth(T->lchild);
int right = treeDepth(T->rchild);
return left > right ? left + 1 : right + 1;
}
return 0;
}
//二叉树的后续遍历算法
int saveDepth(std::vector<int>depthArr,const int level) {
depthArr.push_back(level);
return 0;
}
void PostOrderTraverse(BiTree T,const int level) {
if (T)
{
PostOrderTraverse(T->lchild, level + 1);
PostOrderTraverse(T->rchild, level + 1);
operatorPrint(*T, level);
}
}
//二叉树的中序遍历
void InOrderTraverse(BiTree T, const int level) {
if (T == nullptr)
return;
InOrderTraverse(T->lchild, level + 1);
operatorPrint(*T, level);
InOrderTraverse(T->rchild, level + 1);
}
//二叉树的前序遍历
void PreOrderTraverse(BiTree T, const int level) {
if (T == nullptr)
return;
operatorPrint(*T, level);
PreOrderTraverse(T->lchild, level + 1);
PreOrderTraverse(T->rchild, level + 1);
}
//操作
void operatorPrint(BiTNode T, int level) {
std::cout << T.data << " 位于第 " << level << " 层" << std::endl;
}
main.cpp
#include<iostream>
#include"test.h"
int main()
{
BiTree * binaryTree = initTree();
createTree(binaryTree);
int level = 1;
std::cout << "前序遍历:\n";
PreOrderTraverse(*binaryTree, level);
std::cout << "中序遍历:\n";
InOrderTraverse(*binaryTree, level);
std::cout << "后序遍历:\n";
PostOrderTraverse(*binaryTree, level);
std::cout << treeDepth(*binaryTree) << std::endl;
return 0;
}
结果: