当前位置:   article > 正文

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

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

#pragma once
#include"stdafx.h"

/**
 * @brief 创建一个二叉树类
 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/245899
推荐阅读
相关标签
  

闽ICP备14008679号