目录
二叉树的实现(出错版)
/*
* 二叉树的使用
*/
/*
* 二叉树的结点结构
*/
struct BiNode {
char data;
BiNode* lchid,*rchid;
};
/*
* 二叉链表的实现
*/
class BiTree {
private:
BiNode* Creat();
void Release(BiNode* bt);
void PreOrder(BiNode* bt);
void InOrder(BiNode* bt);
void PostOrder(BiNode* bt);
BiNode* root;//指向根结点的头指针
public:
BiTree(){}
BiTree() {
root = Creat();
}
~BiTree() {
Release(root);
}
//前序遍历二叉树
void PreOrder() {
PreOrder(root);
}
//中序遍历二叉树
void InOrder() {
InOrder(root);
}
//后序遍历二叉树
void PostOrder() {
PostOrder(root);
}
//层序二叉树
void LevelOrder();
};
//层序遍历二叉树
void BiTree::LevelOrder() {
BiNode* Q[100], * q = nullptr;
int font = -1, rear = -1;//队列初始化
if (root == nullptr)
return;
Q[++rear] = root;//根指针入队
while (font!=rear)
{
q = Q[++font];//出队
cout << q->data<<"\t";
if (q->lchid != nullptr)
Q[++rear] = q->lchid;
if (q->rchid != nullptr)
Q[++rear] = q->rchid;
}
}
//前序遍历
void BiTree::PreOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
cout << bt->data;
cout << endl; //访问根结点bt的数据域
PreOrder(bt->lchid); //前序递归遍历bt的左子树
PreOrder(bt->rchid); //前序递归遍历bt的右子树
}
}
//中序遍历
void BiTree::InOrder(BiNode*bt) {
if (bt == nullptr)
return;
else
{
InOrder(bt->lchid); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchid); //中序递归遍历bt的右子树
}
}
//后序遍历
void BiTree::PostOrder(BiNode* bt) {
if (bt == nullptr)
return;
else{
PostOrder(bt->lchid); //后序递归遍历bt的左子树
PostOrder(bt->rchid); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
//建立二叉树
BiNode* BiTree::Creat() {
BiNode* bt;
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') //建立一个空树
bt = nullptr;
else{
bt = new BiNode;
bt->data = ch;
bt->lchid = Creat();//递归建立左子树
bt->rchid = Creat();//递归建立右子树
}
return bt;
}
#include<iostream>
using namespace std;
int mian() {
BiTree T{};//定义对象变量 T
cout << "该二叉树的前序遍历序列为:";
T.PreOrder();
cout << endl;
cout << "该二叉树的中序遍历序列为:";
T.InOrder();
cout << endl;
cout << "该二叉树的后序遍历序列为:";
T.PostOrder();
cout << endl;
cout << "该二叉树的层序遍历序列为:";
T.LevelOrder();
cout << endl;
system("pause");
return 0;
}
但是VS出现错误
全部代码:
更改后:
/*
* 二叉树的使用
*/
#include<iostream>
#include<cstring>
using namespace std;
/*
* 二叉树的结点结构
*/
struct BiNode {
char data;
BiNode* lchid,*rchid;
};
/*
* 二叉链表的实现
*/
class BiTree {
private:
BiNode* Creat();
void Release(BiNode* bt);
void PreOrder(BiNode* bt);
void InOrder(BiNode* bt);
void PostOrder(BiNode* bt);
BiNode* root;//指向根结点的头指针
public:
BiTree() {
root = Creat();
}
~BiTree() {
Release(root);
}
//前序遍历二叉树
void PreOrder() {
PreOrder(root);
}
//中序遍历二叉树
void InOrder() {
InOrder(root);
}
//后序遍历二叉树
void PostOrder() {
PostOrder(root);
}
//层序二叉树
void LevelOrder();
};
//建立二叉树
BiNode* BiTree::Creat()
{
BiNode* bt;
cout << "请依次输入二叉树序列:" << endl;
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') //建立一个空树
bt = nullptr;
else {
bt = new BiNode;
bt->data = ch;
bt->lchid = Creat();//递归建立左子树
bt->rchid = Creat();//递归建立右子树
}
return bt;
}
//销毁二叉树
void BiTree::Release(BiNode* bt) {
if (bt == nullptr)
return;
else {
Release(bt->lchid); //释放左子树
Release(bt->rchid); //释放右子树
delete bt; //释放根结点
}
}
//层序遍历二叉树
void BiTree::LevelOrder() {
BiNode* Q[100], * q = nullptr;
int font = -1, rear = -1;//队列初始化
if (root == nullptr)
return;
Q[++rear] = root;//根指针入队
while (font!=rear)
{
q = Q[++font];//出队
cout << q->data<<"\t";
if (q->lchid != nullptr)
Q[++rear] = q->lchid;
if (q->rchid != nullptr)
Q[++rear] = q->rchid;
}
}
//前序遍历
void BiTree::PreOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
std::cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchid); //前序递归遍历bt的左子树
PreOrder(bt->rchid); //前序递归遍历bt的右子树
}
}
//中序遍历
void BiTree::InOrder(BiNode*bt) {
if (bt == nullptr)
return;
else
{
InOrder(bt->lchid); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchid); //中序递归遍历bt的右子树
}
}
//后序遍历
void BiTree::PostOrder(BiNode* bt) {
if (bt == nullptr)
return;
else{
PostOrder(bt->lchid); //后序递归遍历bt的左子树
PostOrder(bt->rchid); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
int main() {
BiTree T{};//定义对象变量 T
std::cout << "该二叉树的前序遍历序列为:";
T.PreOrder();
std::cout << endl;
std::cout << "该二叉树的中序遍历序列为:";
T.InOrder();
std::cout << endl;
std::cout << "该二叉树的后序遍历序列为:";
T.PostOrder();
std::cout << endl;
std::cout << "该二叉树的层序遍历序列为:";
T.LevelOrder();
std::cout << endl;
system("pause");
return 0;
}
运行结果:
补充计算叶子结点的个数方法后:
/*
* 二叉树的使用
*/
#include<iostream>
#include<cstring>
using namespace std;
/*
* 二叉树的结点结构
*/
struct BiNode {
char data;
BiNode* lchid, * rchid;
};
/*
* 二叉链表的实现
*/
class BiTree {
private:
BiNode* Creat();
void Release(BiNode* bt);
void PreOrder(BiNode* bt);
void InOrder(BiNode* bt);
void PostOrder(BiNode* bt);
int LeafCount(BiNode* bt);
BiNode* root;//指向根结点的头指针
public:
BiTree() {
root = Creat();
}
~BiTree() {
Release(root);
}
//前序遍历二叉树
void PreOrder() {
PreOrder(root);
}
//中序遍历二叉树
void InOrder() {
InOrder(root);
}
//后序遍历二叉树
void PostOrder() {
PostOrder(root);
}
//层序二叉树
void LevelOrder();
//计算二叉树叶子结点个数
void LeafCount() {
cout<<LeafCount(root);
}
};
//建立二叉树
BiNode* BiTree::Creat()
{
BiNode* bt;
//cout << "请依次输入二叉树序列:" << endl;
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') //建立一个空树
bt = nullptr;
else {
bt = new BiNode;//开辟空间
bt->data = ch; //树根
bt->lchid = Creat();//递归建立左子树
bt->rchid = Creat();//递归建立右子树
}
return bt;
}
//销毁二叉树(后序消除法)
void BiTree::Release(BiNode* bt) {
if (bt == nullptr)
return;
else {
Release(bt->lchid); //释放左子树
Release(bt->rchid); //释放右子树
delete bt; //释放根结点
}
}
//层序遍历二叉树
void BiTree::LevelOrder() {
BiNode* Q[100], * q = nullptr;
int font = -1, rear = -1;//队列初始化
if (root == nullptr)
return;
Q[++rear] = root;//根指针入队
while (font != rear)
{
q = Q[++font];//出队
cout << q->data << "\t";
if (q->lchid != nullptr)
Q[++rear] = q->lchid;
if (q->rchid != nullptr)
Q[++rear] = q->rchid;
}
}
//前序遍历
void BiTree::PreOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
std::cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchid); //前序递归遍历bt的左子树
PreOrder(bt->rchid); //前序递归遍历bt的右子树
}
}
//中序遍历
void BiTree::InOrder(BiNode* bt) {
if (bt == nullptr)
return;
else
{
InOrder(bt->lchid); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchid); //中序递归遍历bt的右子树
}
}
//后序遍历
void BiTree::PostOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
PostOrder(bt->lchid); //后序递归遍历bt的左子树
PostOrder(bt->rchid); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
//计算该二叉树的叶子结点个数
int BiTree::LeafCount(BiNode* bt) {
if (bt == nullptr)
return 0;
if (bt->lchid == nullptr && bt->rchid == nullptr) {
return 1;
}
else
{
return LeafCount(bt->lchid) + LeafCount(bt->rchid);
}
}
int main() {
//试验:输入A B # D # # C # #
cout << "请依次输入二叉树序列:" << endl;
BiTree T{};//定义对象变量 T
std::cout << "该二叉树的前序遍历序列为:";
T.PreOrder();
std::cout << endl;
std::cout << "叶子结点的个数为:";
T.LeafCount();
cout << endl;
system("pause");
return 0;
}
结果:
补充计算二叉树深度方法:
/*
* 二叉树的使用
*/
#include<iostream>
#include<cstring>
using namespace std;
/*
* 二叉树的结点结构
*/
struct BiNode {
char data;
BiNode* lchid, * rchid;
};
/*
* 二叉链表的实现
*/
class BiTree {
private:
BiNode* Creat();
void Release(BiNode* bt);
void PreOrder(BiNode* bt);
void InOrder(BiNode* bt);
void PostOrder(BiNode* bt);
int Depth(BiNode* bt);
int LeafCount(BiNode* bt);
BiNode* root;//指向根结点的头指针
public:
BiTree() {
root = Creat();
}
~BiTree() {
Release(root);
}
//前序遍历二叉树
void PreOrder() {
PreOrder(root);
}
//中序遍历二叉树
void InOrder() {
InOrder(root);
}
//后序遍历二叉树
void PostOrder() {
PostOrder(root);
}
//层序二叉树
void LevelOrder();
//计算树的深度
void Depth() {
cout << Depth(root);
}
//计算二叉树叶子结点个数
void LeafCount() {
cout<<LeafCount(root);
}
};
//建立二叉树
BiNode* BiTree::Creat()
{
BiNode* bt;
//cout << "请依次输入二叉树序列:" << endl;
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') //建立一个空树
bt = nullptr;
else {
bt = new BiNode;//开辟空间
bt->data = ch; //树根
bt->lchid = Creat();//递归建立左子树
bt->rchid = Creat();//递归建立右子树
}
return bt;
}
//销毁二叉树(后序消除法)
void BiTree::Release(BiNode* bt) {
if (bt == nullptr)
return;
else {
Release(bt->lchid); //释放左子树
Release(bt->rchid); //释放右子树
delete bt; //释放根结点
}
}
//层序遍历二叉树
void BiTree::LevelOrder() {
BiNode* Q[100], * q = nullptr;
int font = -1, rear = -1;//队列初始化
if (root == nullptr)
return;
Q[++rear] = root;//根指针入队
while (font != rear)
{
q = Q[++font];//出队
cout << q->data << "\t";
if (q->lchid != nullptr)
Q[++rear] = q->lchid;
if (q->rchid != nullptr)
Q[++rear] = q->rchid;
}
}
//前序遍历
void BiTree::PreOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
std::cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchid); //前序递归遍历bt的左子树
PreOrder(bt->rchid); //前序递归遍历bt的右子树
}
}
//中序遍历
void BiTree::InOrder(BiNode* bt) {
if (bt == nullptr)
return;
else
{
InOrder(bt->lchid); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchid); //中序递归遍历bt的右子树
}
}
//后序遍历
void BiTree::PostOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
PostOrder(bt->lchid); //后序递归遍历bt的左子树
PostOrder(bt->rchid); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
//计算该二叉树的叶子结点个数
int BiTree::LeafCount(BiNode* bt) {
if (bt == nullptr)
return 0;
if (bt->lchid == nullptr && bt->rchid == nullptr) {
return 1;
}
else
{
return LeafCount(bt->lchid) + LeafCount(bt->rchid);
}
}
// //计算二叉树的深度
int BiTree::Depth(BiNode *bt){
if (bt == nullptr)
return 0;
else {
int n, m;
m = Depth(bt->lchid);
n = Depth(bt->rchid);
if (m > n)
return m + 1;
else
return n + 1;
}
}
int main() {
//试验:输入A B # D # # C # #
cout << "请依次输入二叉树序列:" << endl;
BiTree T{};//定义对象变量 T
std::cout << "该二叉树的前序遍历序列为:";
T.PreOrder();
std::cout << endl;
std::cout << "叶子结点的个数为:";
T.LeafCount();
cout << endl;
cout << "树的深度为:";
T.Depth();
cout << endl;
system("pause");
return 0;
}
运行结果:
补充计算二叉树结点个数方法:(R+L+D=结点个数)
/*
* 二叉树的使用
*/
#include<iostream>
#include<cstring>
using namespace std;
/*
* 二叉树的结点结构
*/
struct BiNode {
char data;
BiNode* lchid, * rchid;
};
/*
* 二叉链表的实现
*/
class BiTree {
private:
BiNode* Creat(); //建树
void Release(BiNode* bt); //销毁
void PreOrder(BiNode* bt); //前序
void InOrder(BiNode* bt); //中序
void PostOrder(BiNode* bt); //后序
int NodeCount(BiNode* bt); //计算二叉树结点个数
int Depth(BiNode* bt); //计算二叉树深度
int LeafCount(BiNode* bt); //计算二叉树叶子结点个数
BiNode* root; //指向根结点的头指针
public:
BiTree() {
root = Creat();
}
~BiTree() {
Release(root);
}
//前序遍历二叉树
void PreOrder() {
PreOrder(root);
}
//中序遍历二叉树
void InOrder() {
InOrder(root);
}
//后序遍历二叉树
void PostOrder() {
PostOrder(root);
}
//层序二叉树
void LevelOrder();
//计算二叉树结点个数
void NodeCount() {
cout << NodeCount(root);
}
//计算树的深度
void Depth() {
cout << Depth(root);
}
//计算二叉树叶子结点个数
void LeafCount() {
cout<<LeafCount(root);
}
};
//建立二叉树
BiNode* BiTree::Creat()
{
BiNode* bt;
//cout << "请依次输入二叉树序列:" << endl;
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') //建立一个空树
bt = nullptr;
else {
bt = new BiNode;//开辟空间
bt->data = ch; //树根
bt->lchid = Creat();//递归建立左子树
bt->rchid = Creat();//递归建立右子树
}
return bt;
}
//销毁二叉树(后序消除法)
void BiTree::Release(BiNode* bt) {
if (bt == nullptr)
return;
else {
Release(bt->lchid); //释放左子树
Release(bt->rchid); //释放右子树
delete bt; //释放根结点
}
}
//层序遍历二叉树
void BiTree::LevelOrder() {
BiNode* Q[100], * q = nullptr;
int font = -1, rear = -1;//队列初始化
if (root == nullptr)
return;
Q[++rear] = root;//根指针入队
while (font != rear)
{
q = Q[++font];//出队
cout << q->data << "\t";
if (q->lchid != nullptr)
Q[++rear] = q->lchid;
if (q->rchid != nullptr)
Q[++rear] = q->rchid;
}
}
//前序遍历
void BiTree::PreOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
std::cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchid); //前序递归遍历bt的左子树
PreOrder(bt->rchid); //前序递归遍历bt的右子树
}
}
//中序遍历
void BiTree::InOrder(BiNode* bt) {
if (bt == nullptr)
return;
else
{
InOrder(bt->lchid); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchid); //中序递归遍历bt的右子树
}
}
//后序遍历
void BiTree::PostOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
PostOrder(bt->lchid); //后序递归遍历bt的左子树
PostOrder(bt->rchid); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
//计算二叉树结点个数
int BiTree::NodeCount(BiNode* bt) {
if (bt == nullptr)
return 0;
else {
return NodeCount(bt->lchid) + NodeCount(bt->rchid)+1;
}
}
//计算该二叉树的叶子结点个数
int BiTree::LeafCount(BiNode* bt) {
if (bt == nullptr)
return 0;
if (bt->lchid == nullptr && bt->rchid == nullptr) {
return 1;
}
else
{
return LeafCount(bt->lchid) + LeafCount(bt->rchid);
}
}
// //计算二叉树的深度
int BiTree::Depth(BiNode *bt){
if (bt == nullptr)
return 0;
else {
int n, m;
m = Depth(bt->lchid);
n = Depth(bt->rchid);
if (m > n)
return m + 1;
else
return n + 1;
}
}
int main() {
//试验:输入A B # D # # C # #
cout << "请依次输入二叉树序列:" << endl;
BiTree T{};//定义对象变量 T
std::cout << "该二叉树的前序遍历序列为:";
T.PreOrder();
std::cout << endl;
//二叉树结点个数
cout << "二叉树结点个数为:";
T.NodeCount();
cout << endl;
//叶子结点的个数
std::cout << "叶子结点的个数为:";
T.LeafCount();
cout << endl;
//树的深度
cout << "树的深度为:";
T.Depth();
cout << endl;
system("pause");
return 0;
}
运行结果:
二叉树相关方法大实现:
- 计算二叉树深度方法
- 计算二叉树结点个数方法:(R+L+D=结点个数)
- 计算叶子结点的个数方法
/*
* 二叉树的使用
*/
#include<iostream>
#include<cstring>
using namespace std;
/*
* 二叉树的结点结构
*/
struct BiNode {
char data;
BiNode* lchid, * rchid;
};
/*
* 二叉链表的实现
*/
class BiTree {
private:
BiNode* Creat(); //建树
void Release(BiNode* bt); //销毁
void PreOrder(BiNode* bt); //前序
void InOrder(BiNode* bt); //中序
void PostOrder(BiNode* bt); //后序
int NodeCount(BiNode* bt); //计算二叉树结点个数
int Depth(BiNode* bt); //计算二叉树深度
int LeafCount(BiNode* bt); //计算二叉树叶子结点个数
BiNode* root; //指向根结点的头指针
public:
BiTree() {
root = Creat();
}
~BiTree() {
Release(root);
}
//前序遍历二叉树
void PreOrder() {
PreOrder(root);
}
//中序遍历二叉树
void InOrder() {
InOrder(root);
}
//后序遍历二叉树
void PostOrder() {
PostOrder(root);
}
//层序二叉树
void LevelOrder();
//计算二叉树结点个数
void NodeCount() {
cout << NodeCount(root);
}
//计算树的深度
void Depth() {
cout << Depth(root);
}
//计算二叉树叶子结点个数
void LeafCount() {
cout<<LeafCount(root);
}
};
//建立二叉树
BiNode* BiTree::Creat()
{
BiNode* bt;
//cout << "请依次输入二叉树序列:" << endl;
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == '#') //建立一个空树
bt = nullptr;
else {
bt = new BiNode;//开辟空间
bt->data = ch; //树根
bt->lchid = Creat();//递归建立左子树
bt->rchid = Creat();//递归建立右子树
}
return bt;
}
//销毁二叉树(后序消除法)
void BiTree::Release(BiNode* bt) {
if (bt == nullptr)
return;
else {
Release(bt->lchid); //释放左子树
Release(bt->rchid); //释放右子树
delete bt; //释放根结点
}
}
//层序遍历二叉树
void BiTree::LevelOrder() {
BiNode* Q[100], * q = nullptr;
int font = -1, rear = -1;//队列初始化
if (root == nullptr)
return;
Q[++rear] = root;//根指针入队
while (font != rear)
{
q = Q[++font];//出队
cout << q->data << "\t";
if (q->lchid != nullptr)
Q[++rear] = q->lchid;
if (q->rchid != nullptr)
Q[++rear] = q->rchid;
}
}
//前序遍历
void BiTree::PreOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
std::cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchid); //前序递归遍历bt的左子树
PreOrder(bt->rchid); //前序递归遍历bt的右子树
}
}
//中序遍历
void BiTree::InOrder(BiNode* bt) {
if (bt == nullptr)
return;
else
{
InOrder(bt->lchid); //中序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchid); //中序递归遍历bt的右子树
}
}
//后序遍历
void BiTree::PostOrder(BiNode* bt) {
if (bt == nullptr)
return;
else {
PostOrder(bt->lchid); //后序递归遍历bt的左子树
PostOrder(bt->rchid); //后序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}
//计算二叉树结点个数
int BiTree::NodeCount(BiNode* bt) {
if (bt == nullptr)
return 0;
else {
return NodeCount(bt->lchid) + NodeCount(bt->rchid)+1;
}
}
//计算该二叉树的叶子结点个数
int BiTree::LeafCount(BiNode* bt) {
if (bt == nullptr)
return 0;
if (bt->lchid == nullptr && bt->rchid == nullptr) {
return 1;
}
else
{
return LeafCount(bt->lchid) + LeafCount(bt->rchid);
}
}
// //计算二叉树的深度
int BiTree::Depth(BiNode *bt){
if (bt == nullptr)
return 0;
else {
int n, m;
m = Depth(bt->lchid);
n = Depth(bt->rchid);
if (m > n)
return m + 1;
else
return n + 1;
}
}
int main() {
//试验:输入A B # D # # C # #
cout << "请依次输入二叉树序列:" << endl;
BiTree T{};//定义对象变量 T
std::cout << "该二叉树的前序遍历序列为:";
T.PreOrder();
std::cout << endl;
//二叉树结点个数
cout << "二叉树结点个数为:";
T.NodeCount();
cout << endl;
//叶子结点的个数
std::cout << "叶子结点的个数为:";
T.LeafCount();
cout << endl;
//树的深度
cout << "树的深度为:";
T.Depth();
cout << endl;
system("pause");
return 0;
}
运行结果: