二叉树创建+遍历(C++)

这篇博客总结了二叉树的创建及四种遍历方法:前序、中序、后序和层序遍历,以C++语言实现,并提供了一个具体的二叉树示例及运行截图。
摘要由CSDN通过智能技术生成

二叉树的创建、前序遍历、中序遍历、后序遍历、层序遍历总结如下(C++):

以下面这棵二叉树为例:

以这棵二叉树为例

#include <iostream>
const int MAX = 100;  //定义一个常量
using namespace std;

typedef struct BiNode  //定义二叉链表的结点结构
{
	char data;  //定义结点的数据域
	BiNode* lchild, * rchild;  //定义左右孩子指针
}BiNode,*Bitree;  //等同于BiNode BiNode,*Bitree;

Bitree Q[MAX];  //定义一个结构体指针数组当作队列,层序遍历用到
class BiTree
{
public:
	BiTree();  //构造函数,建立一棵二叉树
	~BiTree();  //析构函数,释放各结点的存储空间
	void PreOrder() { PreOrder(root); }  //前序遍历二叉树
	void InOrder() { InOrder(root); }  //中序遍历二叉树
	void PostOrder(){PostOrder(root);}  //后序遍历二叉树
	void LeverOrder();  //层序遍历二叉树
private:
	BiNode* root;  //指向根结点的头指针
	BiNode* Creat(BiNode* bt);  //构造函数调用
	void Release(BiNode* bt);  //析构函数调用
	void PreOrder(BiNode* bt);  //前序遍历函数调用
	void InOrder(BiNode* bt);  //中序遍历函数调用
	void PostOrder(BiNode* bt);  //后序遍历函数调用
};

BiTree::BiTree()
{
	root=Creat(root);
}
BiTree::~BiTree()
{
	Release(root);
}

BiNode* BiTree::Creat(BiNode* bt)
{
	char ch;  //输入结点的数据信息,假设为字符
	cin >> ch;
	if (ch == '#') //根节点为空,创建一棵空树
	{
		bt = NULL;
	}
	else   //采用前序遍历的方式创建二叉树
	{
		bt = new BiNode;  //创建一个结点
		bt->data = ch;  //该结点的数据域为ch
		bt->lchild = Creat(bt->lchild);  //递归建立左子树
		bt->rchild = Creat(bt->rchild);  //递归建立右子树
	}
	return bt;
}

void BiTree::Release(BiNode* bt)
{
	if (bt != NULL)
	{
		Release(bt->lchild);  //释放左子树
		Release(bt->rchild);  //释放右子树
		delete bt;  //释放根结点
	}
}

void BiTree::PreOrder(BiNode* bt)
{
	if (bt == NULL)return;  //递归调用结束的条件
	else
	{
		cout << bt->data;  //访问根结点bt的数据域
		PreOrder(bt->lchild);  //前序递归遍历bt的左子树
		PreOrder(bt->rchild);  //前序递归遍历bt的右子树
	}
}

void BiTree::InOrder(BiNode* bt)
{
	if (bt == NULL)return;  //递归调用结束的条件
	else
	{
		InOrder(bt->lchild);  //中序递归遍历bt的左子树
		cout << bt->data;  //访问根结点bt的数据域
		InOrder(bt->rchild);  //中序递归遍历bt的右子树
	}
}

void BiTree::PostOrder(BiNode* bt)
{
	if (bt == NULL)return;  //递归调用结束的条件
	else
	{
		PostOrder(bt->lchild);  //后序递归遍历bt的左子树
		PostOrder(bt->rchild);  //后序递归遍历bt的右子树
		cout << bt->data;  //访问根结点bt的数据域
	}
}

void BiTree::LeverOrder()
{
	int front = -1;
	int rear = -1;  //采用顺序队列,并假定不会发生上溢
	if (root == NULL)return;  //二叉树为空,算法结束
	Q[++rear] = root;  //指向根结点的指针入队
	Bitree q;
	while (front!=rear)  //当队列非空时
	{
		q = Q[++front];  //出队
		cout << q->data;
		if (q->lchild != NULL)
		{
			Q[++rear] = q->lchild;
		}
		if (q->rchild != NULL)
		{
			Q[++rear] = q->rchild;
		}
	}
}
int main()
{
	BiTree mytree;
	cout << "前序遍历的结果为:";
	mytree.PreOrder();
	cout << endl;
	cout << "中序遍历的结果为:";
	mytree.InOrder();
	cout << endl;
	cout << "后序遍历的结果为:";
	mytree.PostOrder();
	cout << endl;
	cout << "层序遍历的结果为:";
	mytree.LeverOrder();
	cout << endl;
	return 0;
}

运行截图如下:
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值