第五章 树和二叉树翻转学习任务
一、本章的重点
分二大部分:树和二叉树。
从逻辑结构上分,树是表示一对多和一种结构,一般用于表达祖先后代、上下级和整合部分等相关关系。
本章学习,在前面的线性表相关的基础上,进一步复杂的数据结构。掌握具体层次对象的数据结构表达和存储方法,以及操作方法。了解树特别是二叉树的广泛应用。
二、学习目标
本章节学习目标,具体地说,要掌握以下几个重点知识点:
· 树的相关概念;
· 树的遍历;
· 树的存储表达方法;
· 二叉树的概念及性质。
· 二叉树的遍历和算法实现。
· 树和二叉树之间的转换。
· 哈夫曼树的应用。
#include <iostream>
const int MaxSize=100;
//创建树的节点结构体
template <class DataType>
struct SNode
{
DataType data;
int node;
};
template <class DataType>
class DoubleTree {
public:
public:
DoubleTree(DataType a[],int n);
~DoubleTree(){std::cout<<"我是树,我已经被销毁";}
int Length(){returnlength;}
void GetParents(int i);
void GetSon(int i);
int Locate(DataType x);
void PrintList();
private:
SNode<int> Tree[100];
int length;
};
template <class DataType>
DoubleTree<DataType>::DoubleTree(DataType a[],int n)
{
if (n<=0&&n>=MaxSize)throw "创建失败";
length=n;
for (int i=0; i<length; i++) {
Tree[i].data=NULL;
}
for (int j=0;j<length; j++) {
Tree[j].data=a[j];
Tree[j].node=j+1;
}
};
template <class DataType>
void DoubleTree<DataType>::GetParents(int i)
{
//他的妈妈
if (i%2==0) {
std::cout<<"节点"<<i<<"的母亲为"<<Tree[i/2].data<<"下标为"<<Tree[i/2].node;
}
else
{
std::cout<<"节点"<<i<<"的母亲为"<<Tree[(i-1)%2].data<<"下标为"<<Tree[(i-1)/2].node;
}
std::cout<<"\n";
}
template <class DataType>
void DoubleTree<DataType>::GetSon(int i)
{
//他的左孩子为
if(Tree[2*i].data!=NULL)
std::cout<<"节点"<<i<<"的左孩子为"<<Tree[2*i].data<<"下标为"<<Tree[2*i].node;
else std::cout<<"没有左孩子";
//他的右孩子为
if(Tree[2*i+1].data!=NULL)
std::cout<<"节点"<<i<<"的右孩子为"<<Tree[2*i+1].data<<"下标为"<<Tree[2*i+1].node;
else std::cout<<"没有右孩子"; std::cout<<"\n";
}
template <class DataType>
void DoubleTree<DataType>::PrintList()
{
for (int i=0;i<length;i++) {
std::cout<<"下标为"<<Tree[i].node<<"值为"<<Tree[i].data<<" ";
}
std::cout<<"\n";
}
template <class DataType>
int DoubleTree<DataType>::Locate(DataType x)
{
for (int i=0; i<length; i++) {
if (Tree[i].data==x) {
break;
}
else continue;
}
std::cout<<"\n";
}
int main(int argc,const char * argv[]) {
int a[7]={1,2,3,6,NULL,10,20};
DoubleTree<int> TREE(a,7);
TREE.PrintList();
TREE.GetSon(3);
TREE.GetParents(4);
return 0;
}
实验总结:
本次二叉树我用了数组实现,但是跟之前的模板类有些不同,这次是先创建好一颗空树,没有数值的地方用NULL表示,然后把数值都填进去。本次实验还算可以,但是听老师说树是很重要的知识点,希望能更好的掌握,课后还需多加练习.