C++实现数据结构——二叉树(注释完整、逻辑清晰)

2020年8月14日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】



1. 引言

用C++实现了简单的二叉树类,成员函数实现了二叉树的创建,遍历,求高度,求结点层次,求结点的父结点、兄弟结点和子结点等功能,主函数中有所有成员函数的测试案例。代码是用VS2019实现的,每个函数的功能都添加了一定注释,由于用了模板,函数的声明和定义都放在了.h文件中,完整工程放在了我的github上,有需要的也可以自取。

github地址:https://github.com/March225/Data-structure-implemented-by-Cpp

2. 主文件——main.cpp

/**
 *  @Copyright (C) 2020 March. All rights reserved.
 *  @license   GNU General Public License (GPL)
 *  @author	   March
 *  @email	   345916208@qq.com
 *  @file	   main.cpp
 *  @brief	   二叉树的C++实现主文件
 *  @version   1.0
 *  @date	   2020-08-14
 */

#include "stdafx.h"
#include "binarytree.h"

int main()
{
   
	FILE* stream1;
	ios::sync_with_stdio(false); // 让c风格的输入输出流和c++的输入输出流分开,使cin读入的更快
	freopen_s(&stream1, "1.in", "r", stdin); // 直接从文档中读取待输入的数据

	BinaryTree<char>* BiT1 = new BinaryTree<char>;
	BiT1->CreatByPreOrderOfExtBiT(); // 通过扩展二叉树的前序遍历创建二叉树

	// 递归遍历
	cout << "前序遍历(递归):";
	BiT1->PreOrderTraverse(0);
	cout << "中序遍历(递归):";
	BiT1->InOrderTraverse(0);
	cout << "后序遍历(递归):";
	BiT1->PostOrderTraverse(0);
	cout << "层次遍历(递归):";
	BiT1->LevelOrderTraverse(0);

	// 非递归遍历
	cout << endl << "前序遍历(非递):";
	BiT1->PreOrderTraverse(1);
	cout << "中序遍历(非递):";
	BiT1->InOrderTraverse(1);
	cout << "后序遍历(非递):";
	BiT1->PostOrderTraverse(1);
	cout << "层次遍历(非递):";
	BiT1->LevelOrderTraverse(1);

	// 中序遍历输出各结点的值及对应层次
	cout << endl << "中序输出各结点的值及对应层次:" << endl;
	BiT1->PrintLeveInOrderTra();

	// 交换每个结点的左右子结点
	cout << "交换每个结点的左右子结点后:" << endl;
	BiT1->ExchangeValOfLAndRChild();
	cout << "层次遍历(递归):";
	BiT1->LevelOrderTraverse(0);

	// 打印二叉树中值为val的结点的层次
	char val1 = 'C';
	cout << endl << "二叉树中结点 " << val1 << " 的层次:" << BiT1->GetLevelByVal(val1) << endl;

	// 打印二叉树结点总数
	cout << endl << "二叉树结点总数:" << BiT1->NumberOfBiTNode() << endl;

	// 打印二叉树叶子结点数
	cout << endl << "二叉树叶子结点数:" << BiT1->NumberOfBiTLeafNode() << endl;

	// 打印二叉树中度为2的结点数
	cout << endl << "二叉树中度为2的结点数:" << BiT1->NumberOfNodeWithTwoDeg() << endl;

	// 返回值为val的结点的父结点
	char val2 = 'C';
	BiTNode<char>* parent = BiT1->GetParent(val2);
	if(parent)
		cout << endl << "二叉树中结点 " << val2 << " 的父结点:"  << parent->val << endl;
	else
		cout << endl << "结点 " << val2 << " 不存在,或无父节点" << endl;

	// 返回值为val的结点的兄弟结点
	char val3 = 'E';
	BiTNode<char>* sibling = BiT1->GetSibling(val3);
	if (sibling)
		cout << endl << "二叉树中结点 " << val3 << " 的兄弟结点:" << sibling->val << endl;
	else
		cout << endl << "结点 " << val3 << " 不存在,或无兄弟结点" << endl;

	// 返回值为val的结点的左子结点
	char val4 = 'B';
	BiTNode<char>* left_child = BiT1->GetLeftChild(val4);
	if (left_child)
		cout << endl << "二叉树中结点 " << val4 << " 的左子结点:" << left_child->val << endl;
	else
		cout << endl << "结点 " << val4 << " 不存在,或无左子结点" << endl;

	// 打印二叉树高度
	cout << endl << "二叉树的高度:" << BiT1->GetHeight() << endl;

	delete BiT1;
	return 0;
}

3. 二叉树类 .h文件——binarytree.h

#pragma once
#include"stdafx.h"

/**
 * @brief 创建一个二叉树类
 */
template <typename ElemType>
class BinaryTree
{
   
private:
	BiTNode
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值