数据结构--二叉树的实现(C++)

前言

数据结构实验作业--用二叉链表实现二叉树(c++版)

包括二叉树的构建、二叉树的销毁,前序遍历、中序遍历、后序遍历、层序遍历等基本操作。

还有求二叉树的叶子结点个数,二叉树的深度、结点个数等。


提示:以下是本篇文章正文内容,下面案例可供参考

1.二叉树的结点定义:

template
struct BiNode {
	Datatype data;
	BiNode *lchild, *rchild;
};

2.二叉链表类定义:

template
class BiTree {
public :
	BiTree() { root = Creat(); }//构造函数,构造一颗二叉树
	~BiTree() { Release(root); }//析构函数,释放各结点的存储空间
	void PreOrder() { PreOrder(root); }//前序遍历
	void InOrder() { InOrder(root); }//中序遍历
	void PostOrder() { PostOrder(root); }//后序遍历
	void LevelOrder();//层序遍历
	int NodeNum() { return NodeNum(root); }//二叉树的结点总个数
	int TreeDepth() { return TreeDepth(root); }//二叉树的深度
	void LeafNode() { LeafNode(root); }//二叉树叶子结点数量
private:
	BiNode* Creat();//构造函数调用
	void Release(BiNode* bt);//析构函数调用
	void PreOrder(BiNode* bt);//前序遍历函数调用
	void PostOrder(BiNode* bt);//后序遍历函数调用
	void InOrder(BiNode* bt);//中序遍历函数调用
	int NodeNum(BiNode* bt);//结点个数函数调用
	int TreeDepth(BiNode* bt);//树深度函数调用
	void LeafNode(BiNode* bt);//叶子结点函数调用
	BiNode* root;//指向根结点的头指针
};

3.基本操作的实现

构造函数

template
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;
}

析构函数

template
void BiTree::Release(BiNode* bt) {
	if (bt == nullptr) {
		return;
	}
	else {
		Release(bt->lchild);//释放左子树
		Release(bt->rchild);//释放右子树
		delete bt;
	}
}

前序遍历

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

中序遍历

template
void BiTree::InOrder(BiNode* bt) {
	if (bt == nullptr) return;
	else {
		InOrder(bt->lchild);
		cout << bt -> data << '\t';
		InOrder(bt->rchild);
	}
}

后序遍历

template
void BiTree::PostOrder(BiNode* bt) {
	if (bt == nullptr) return;
	else {
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
        cout << bt->data << '\t';
	}
}

层序遍历

template
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 << "\t";
		if (q->lchild != nullptr) Q[++rear] = q->lchild;
		if (q->rchild != nullptr) Q[++rear] = q->rchild;
	}
}

结点个数

template
int BiTree::NodeNum(BiNode *bt) {
	//递归遍历所有结点 如果不是空结点的话,递归返回值加1
	if (bt == nullptr) return 0;
	else {
		return NodeNum(bt->lchild) + NodeNum(bt->rchild) + 1;
	}
}

二叉树的深度

template
int BiTree::TreeDepth(BiNode* bt) {
	//每个节点都有自己的左右子树,每次返回当前节点左右子树长度大的那个
	//如果根节点为空,则深度为0,返回0,递归出口
	//否则深度至少为1,然后累加他们左右子树的深度
	int ldepth = 1, rdepth = 1;
	if (bt == nullptr) return 0;
	else {
		ldepth += TreeDepth(bt->lchild);
		rdepth += TreeDepth(bt->rchild);
	}
	return ((ldepth > rdepth) ? ldepth : rdepth);
}

叶子结点

template
void BiTree::LeafNode(BiNode* bt) {
	//找到叶子结点返回值加1,返回值计数,
	//2种情况
	//1.节点为空 返回0,递归出去
	//2.每当到达叶子结点,返回1,递归给上一层函数
	if (bt != nullptr) {
		if (bt->lchild == 0 && bt->rchild == 0) {
			cout << bt->data;
		}
		LeafNode(bt->lchild);
		LeafNode(bt->rchild);
	}
}

具体使用

int main() {
	BiTree T{};
	cout << "该二叉树的前序遍历序列是:";
	T.PreOrder();
	cout << "\n该二叉树的中序遍历序列是:";
	T.InOrder();
	cout << "\n该二叉树的后序遍历序列是:";
	T.PostOrder();
	cout << "\n该二叉树的层序遍历序列是:";
	T.LevelOrder();
	cout << "\n该二叉树的结点个数为:"<

注意:输入的格式

数据结构--二叉树的实现(C++)_第1张图片运行结果:

数据结构--二叉树的实现(C++)_第2张图片


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(算法,数据结构,b树)