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