二叉树的链式表示及实现(实验6--作业)

一、功能概述

这段 C++ 代码实现了二叉树的一系列操作,包括创建二叉树、前序遍历、中序遍历、后序遍历、层次遍历、中序非递归遍历、求二叉树深度、交换左右子树、统计节点个数以及销毁二叉树等功能。

二、主要数据结构和类型定义

  1. BiTNode结构体表示二叉树的节点,包含数据域data和左右子节点指针leftright
  2. BiTree是指向BiTNode的指针类型,用于表示二叉树。
  3. 定义了一些宏,如MAXSIZE表示最大长度、OVERFLOw表示内存分配失败的返回值等,并定义了状态类型Status

三、主要函数功能

  1. CreateBiTree:通过输入字符序列创建二叉树,若输入#表示空节点。
  2. preOrder:前序遍历二叉树,先访问根节点,再遍历左子树和右子树。
  3. inOrder:中序遍历二叉树,先遍历左子树,再访问根节点,最后遍历右子树。
  4. postOrder:后序遍历二叉树,先遍历左子树和右子树,最后访问根节点。
  5. levelOrder:层次遍历二叉树,利用队列实现。
  6. Order:中序非递归遍历二叉树,利用栈实现。
  7. Depth:求二叉树的深度,通过递归计算左右子树深度并取较大值加一得到。
  8. Swap:递归交换二叉树的左右子树。
  9. Count:统计二叉树的节点个数,通过递归累加左右子树节点个数加一得到。
  10. DestroyBiTree:销毁二叉树,通过递归释放每个节点的内存。

四、主函数流程

  1. 在主函数中,首先初始化一个二叉树Tnullptr
  2. 调用CreateBiTree创建二叉树。
  3. 输出二叉树交换左右子树前的各种遍历结果、深度和节点个数。
  4. 调用Swap交换二叉树的左右子树。
  5. 输出交换后的各种遍历结果、深度和节点个数。
  6. 调用DestroyBiTree销毁二叉树。
#include<bits/stdc++.h>//万能头文件
using namespace std;//命名空间

#define MAXSIZE 100 //最大长度
#define OVERFLOw -2
#define OK 1
#define TeleType char
#define ERROR 0

typedef int Status;

typedef struct TreeNode{
	TeleType data;
	//左右子结点
	struct TreeNode* left;
	struct TreeNode* right;
}BiTNode,*BiTree;

// 树的创建
void CreateBiTree(BiTree& T) {
	TeleType ch;
	cin >> ch;
	if (ch == '#')
		T = nullptr;
	else {
		T = new BiTNode;
		if (!T)
			exit(OVERFLOw); // 内存分配失败
		T->data = ch;
		CreateBiTree(T->left); // 左子树
		CreateBiTree(T->right); // 右子树
	}
}

// 前序遍历  
void preOrder(BiTree& T) {
	// 根 左 右
	if (T) {
		cout << T->data << " ";
		preOrder(T->left);
		preOrder(T->right);
	}
}
//中序遍历  
void inOrder(BiTree& T){
	// 左 根 右
	if(T){
		inOrder(T->left);
		cout << T->data << " ";
		inOrder(T->right);
	}
}
//后序遍历  
void postOrder(BiTree& T){
	//左 右 根 
	if(T){
		postOrder(T->left);
		postOrder(T->right);
		cout << T->data << " ";
	
	}
}
//层次遍历  
void levelOrder(BiTree& T){
	if(!T) return ;//树为空 直接返回
	queue<BiTree> q;//元素类型为BiTree的队列
	q.push(T);//初始根节点填入
	while(!q.empty()){
		BiTree node = q.front();//临时存当前节点
		q.pop();//当前节点出队
		cout<<node->data<<" ";//打印当前节点
		//看当前节点的另外两个节点
		if(node->left){
			q.push(node->left);
		}
		if(node->right){
			q.push(node->right);
		}
	}
}
//中序非递归遍历  
void Order(BiTree& T){
	stack<BiTree> St;
	BiTNode* p = T;
	while(p||!St.empty()){
	if(p){
		St.push(p);
		p = p->left;
	}else{
		p = St.top();
		St.pop();
		cout<<p->data<<" ";
		p = p->right;
	}
}
}
//求二叉树深度
int Depth(BiTree& T){
	if(!T) return 0;//空的情况下
	return max(Depth(T->left)+1,Depth(T->right)+1);
}
//递归交换左右子树
void Swap(BiTree& T){
	if(T){
		Swap(T->left);
		Swap(T->right);
		BiTree temp = T->left;
		T->left = T->right;
		T->right = temp;
	}
}
//统计节点个数
int Count(BiTree& T){
	if(!T) return 0;
	return Count(T->left)+Count(T->right)+1;
}
//销毁二叉树
void DestroyBiTree(BiTree& T) {
	//根节点到最后删除
	if (T) {
		DestroyBiTree(T->left);
		DestroyBiTree(T->right);
		delete T;
		T = nullptr;
	}
}
int main() {
	BiTree T = nullptr; // 注意这里初始化为 nullptr
	CreateBiTree(T);
/*	 A					A
	/ \				   / \	
   B   C			  C	  B
  / \ / \	===》	 / \ / \
 D  E F  G			G  F E  D
   / \					/ \
  H   I				   I   H
原先二叉树           交换后的

应输入
ABD##EH##I##CF##G##

	*/
	cout<<"左右子树交换前: "<<endl;
	
	cout<<"前序遍历   : ";
	preOrder(T); 
	cout<<endl;
	
	cout<<"中序遍历   : ";
	inOrder(T);
	cout<<endl;
	
	cout<<"后序遍历   : ";
	postOrder(T);
	cout<<endl;
	
	cout<<"层次遍历   : ";
	levelOrder(T);
	cout<<endl;
	
	cout<<"左右子树交换后: "<<endl;
	
	Swap(T);
	
	cout<<"前序遍历   : ";
	preOrder(T); 
	cout<<endl;
	
	cout<<"中序遍历   : ";
	inOrder(T);
	cout<<endl;
	
	cout<<"非递归中序 : ";
	Order(T);
	cout<<endl;
	
	cout<<"后序遍历   : ";
	postOrder(T);
	cout<<endl;
	
	cout<<"层次遍历   : ";
	levelOrder(T);
	cout<<endl;
	
	cout<<"二叉树深度 = "<<Depth(T)<<endl;
	cout<<"节点个数 = "<<Count(T)<<endl;
	DestroyBiTree(T);
	return 0;
}

五、运行结果如图所示 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值