一、功能概述
这段 C++ 代码实现了二叉树的一系列操作,包括创建二叉树、前序遍历、中序遍历、后序遍历、层次遍历、中序非递归遍历、求二叉树深度、交换左右子树、统计节点个数以及销毁二叉树等功能。
二、主要数据结构和类型定义
BiTNode结构体表示二叉树的节点,包含数据域data和左右子节点指针left、right。BiTree是指向BiTNode的指针类型,用于表示二叉树。- 定义了一些宏,如
MAXSIZE表示最大长度、OVERFLOw表示内存分配失败的返回值等,并定义了状态类型Status。
三、主要函数功能
CreateBiTree:通过输入字符序列创建二叉树,若输入#表示空节点。preOrder:前序遍历二叉树,先访问根节点,再遍历左子树和右子树。inOrder:中序遍历二叉树,先遍历左子树,再访问根节点,最后遍历右子树。postOrder:后序遍历二叉树,先遍历左子树和右子树,最后访问根节点。levelOrder:层次遍历二叉树,利用队列实现。Order:中序非递归遍历二叉树,利用栈实现。Depth:求二叉树的深度,通过递归计算左右子树深度并取较大值加一得到。Swap:递归交换二叉树的左右子树。Count:统计二叉树的节点个数,通过递归累加左右子树节点个数加一得到。DestroyBiTree:销毁二叉树,通过递归释放每个节点的内存。
四、主函数流程
- 在主函数中,首先初始化一个二叉树
T为nullptr。 - 调用
CreateBiTree创建二叉树。 - 输出二叉树交换左右子树前的各种遍历结果、深度和节点个数。
- 调用
Swap交换二叉树的左右子树。 - 输出交换后的各种遍历结果、深度和节点个数。
- 调用
DestroyBiTree销毁二叉树。
#include<bits/stdc++.h>//万能头文件
using namespace std;//命名空间
#define MAXSIZE 100 //最大长度
#define OVERFLOw -2
#define OK 1
#define TeleType char
#define ERROR 0
typedef int Status;
typedef struct TreeNode{
TeleType data;
//左右子结点
struct TreeNode* left;
struct TreeNode* right;
}BiTNode,*BiTree;
// 树的创建
void CreateBiTree(BiTree& T) {
TeleType ch;
cin >> ch;
if (ch == '#')
T = nullptr;
else {
T = new BiTNode;
if (!T)
exit(OVERFLOw); // 内存分配失败
T->data = ch;
CreateBiTree(T->left); // 左子树
CreateBiTree(T->right); // 右子树
}
}
// 前序遍历
void preOrder(BiTree& T) {
// 根 左 右
if (T) {
cout << T->data << " ";
preOrder(T->left);
preOrder(T->right);
}
}
//中序遍历
void inOrder(BiTree& T){
// 左 根 右
if(T){
inOrder(T->left);
cout << T->data << " ";
inOrder(T->right);
}
}
//后序遍历
void postOrder(BiTree& T){
//左 右 根
if(T){
postOrder(T->left);
postOrder(T->right);
cout << T->data << " ";
}
}
//层次遍历
void levelOrder(BiTree& T){
if(!T) return ;//树为空 直接返回
queue<BiTree> q;//元素类型为BiTree的队列
q.push(T);//初始根节点填入
while(!q.empty()){
BiTree node = q.front();//临时存当前节点
q.pop();//当前节点出队
cout<<node->data<<" ";//打印当前节点
//看当前节点的另外两个节点
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
}
//中序非递归遍历
void Order(BiTree& T){
stack<BiTree> St;
BiTNode* p = T;
while(p||!St.empty()){
if(p){
St.push(p);
p = p->left;
}else{
p = St.top();
St.pop();
cout<<p->data<<" ";
p = p->right;
}
}
}
//求二叉树深度
int Depth(BiTree& T){
if(!T) return 0;//空的情况下
return max(Depth(T->left)+1,Depth(T->right)+1);
}
//递归交换左右子树
void Swap(BiTree& T){
if(T){
Swap(T->left);
Swap(T->right);
BiTree temp = T->left;
T->left = T->right;
T->right = temp;
}
}
//统计节点个数
int Count(BiTree& T){
if(!T) return 0;
return Count(T->left)+Count(T->right)+1;
}
//销毁二叉树
void DestroyBiTree(BiTree& T) {
//根节点到最后删除
if (T) {
DestroyBiTree(T->left);
DestroyBiTree(T->right);
delete T;
T = nullptr;
}
}
int main() {
BiTree T = nullptr; // 注意这里初始化为 nullptr
CreateBiTree(T);
/* A A
/ \ / \
B C C B
/ \ / \ ===》 / \ / \
D E F G G F E D
/ \ / \
H I I H
原先二叉树 交换后的
应输入
ABD##EH##I##CF##G##
*/
cout<<"左右子树交换前: "<<endl;
cout<<"前序遍历 : ";
preOrder(T);
cout<<endl;
cout<<"中序遍历 : ";
inOrder(T);
cout<<endl;
cout<<"后序遍历 : ";
postOrder(T);
cout<<endl;
cout<<"层次遍历 : ";
levelOrder(T);
cout<<endl;
cout<<"左右子树交换后: "<<endl;
Swap(T);
cout<<"前序遍历 : ";
preOrder(T);
cout<<endl;
cout<<"中序遍历 : ";
inOrder(T);
cout<<endl;
cout<<"非递归中序 : ";
Order(T);
cout<<endl;
cout<<"后序遍历 : ";
postOrder(T);
cout<<endl;
cout<<"层次遍历 : ";
levelOrder(T);
cout<<endl;
cout<<"二叉树深度 = "<<Depth(T)<<endl;
cout<<"节点个数 = "<<Count(T)<<endl;
DestroyBiTree(T);
return 0;
}
五、运行结果如图所示


8325

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



