二叉树实验
实现二叉树的构造,析构。以及3种深度优先遍历和它的广度优先遍历。缺点是利用递归构造的二叉树是扩展二叉树,构造的二叉树的扩展字符的位置要确保合理,构造函数有待改进。
头文件
#pragma once
struct BiNode {
char data;//数据域
BiNode* lchild, * rchild;//指向左节点右节点的指针
};
class BiTree
{
public:
BiTree() { root = creat(); }//构造函数,构造一棵二叉树
~BiTree() { release(root); }//析构函数,释放各个结点存储空间
void preOrder() { preOrder(root); }//前序遍历二叉树
void inOrder() { inOrder(root); }//中序遍历二叉树
void postOrder() { postOrder(root); }//后序遍历二叉树
void levelOrder();//后序遍历二叉树
private:
BiNode* root;//根节点
BiNode* creat();//构造
void release(BiNode* bt);//析构函数调用
void preOrder(BiNode* bt);//前序遍历调用
void inOrder(BiNode* bt);//中序遍历调用
void postOrder(BiNode* bt);//后序遍历调用
};
源文件
#include "BiTree.h"
#include<iostream>
using namespace std;
BiNode* BiTree::creat() {
BiNode* bt;
char ch;
cin >> ch;
if (ch == '#')bt=nullptr;
else {
bt = new BiNode;//生成一个新结点
bt->data = ch;
bt->lchild = creat();//递归建立左子树
bt->rchild = creat();//递归建立右子树
}
return bt;
}
void BiTree::release(BiNode* bt) {
if (bt != nullptr) {
release(bt->lchild);//释放左子树
release(bt->rchild);//释放右子树
delete bt;
}
}
void BiTree::preOrder(BiNode* bt) {
if (bt == nullptr) return;//递归结束条件
else {
cout << bt->data << " ";
preOrder(bt->lchild);//递归前序遍历左子树
preOrder(bt->rchild);//递归前序遍历右子树
}
}
void BiTree::inOrder(BiNode* bt) {
if (bt == nullptr) return;//递归结束条件
else {
inOrder(bt->lchild);//递归中序遍历左子树
cout << bt->data << " ";
inOrder(bt->rchild);//递归中序遍历右子树
}
}
void BiTree::levelOrder() {
BiNode* Q[100], * q = nullptr;
int front = -1, rear = -1;//队列初始化
if (root == nullptr)return;//二叉树为空,算法结束
Q[++rear] = root;//根指针入队
while (front != rear) {
q = Q[++front];//出队
cout << q->data << " ";
if (q->lchild != nullptr)Q[++rear] = q->lchild;
if (q->rchild != nullptr)Q[++rear] = q->rchild;
}
}
void BiTree::postOrder(BiNode* bt) {
if (bt == nullptr) return;//递归结束条件
else {
postOrder(bt->lchild);//递归后序遍历左子树
postOrder(bt->rchild);//递归后序遍历右子树
cout << bt->data << " ";
}
}
测试程序
#include<iostream>
using namespace std;
#include"BiTree.h"
int main() {
cout << "请输入构造扩展二叉树的节点值:";
BiTree T;
cout << "层序遍历:";
T.levelOrder();
cout << endl;
cout << "前序遍历:";
T.preOrder();
cout << endl;
cout << "中序遍历:";
T.inOrder();
cout << endl;
cout << "后序遍历:";
T.postOrder();
cout << endl;
}