二叉树实验

二叉树实验

实现二叉树的构造,析构。以及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;

}

测试结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值