关闭

二叉树的顺序存储结构的C++实现

标签: 二叉树顺序存储结构
1447人阅读 评论(0) 收藏 举报

本以为二叉树的顺序存储结构实现非常简单,类似于线性表,而在实际操作当中遇到了一些小问题,首先是如何判别树节点是否为空,我采用的方法初始化数组值为-111,新插入的节点覆盖初始值,而没有覆盖初始值的则认为是空节点。对于节点i,其左儿子节点为2*i,右儿子节点为2*i+1,掌握了这个规律,二叉树的前中后序遍历就不难实现了,本文只以前序遍历进行间接。Print函数是根据数组的顺序打印元素的,对于空节点选择跳过,可以认为是层次遍历的方法,递归实现的时候开始使用了循环,犯了逻辑不清的错误,在调试的时候发现了此问题,递归就已经是循环了。顺序存储的二叉树有很多空节点,在内存空间的使用上是浪费的,不过层次清晰,按层次遍历实现方便,适合初学者学习使用。下面是二叉树的顺序存储结构的C++实现:

//linearbintree.h
#ifndef LINEARBINTREE_H
#define LINEARBINTREE_H
#include <IOSTREAM>
#include <MEMORY>
const int TREEMAXSIZE=100;
template<class Type>
class LinearBinTree
{
private:
Type Data[TREEMAXSIZE];
int last;
public:
LinearBinTree():last(0){
for(int i=0;i<TREEMAXSIZE;i++)
Data[i]=Type(-111);
}
~LinearBinTree(){}
bool AddNode(Type);
bool IsEmpty(){return last==0;}
bool IsFull(){return TREEMAXSIZE-1<=last;}
void Print();
void PreOrderTraversal();
void PreOrderTraversal(int );
};
template<class Type>
bool LinearBinTree<Type>::AddNode(Type x)
{
if(IsFull())
return false;
if(IsEmpty())
{
Data[1]=x;
last=1;
return true;
}
int i=1;
while(i)
{
if(Data[i]==Type(-111))
{
Data[i]=x;
last=(i>last?i:last);
return true;
} 
if(Data[i]>x)
{
i=2*i;
}
else
i=2*i+1;
}
return false;
}
template<class Type>
void LinearBinTree<Type>::Print()
{
for(int i=1;i<=last;i++)
{
if(Data[i]==Type(-111))
continue;
std::cout<<Data[i]<<" ";
}
std::cout<<std::endl;
}
template<class Type>
void LinearBinTree<Type>::PreOrderTraversal()
{
LinearBinTree<Type>::PreOrderTraversal(1);
}
template<class Type>
void LinearBinTree<Type>::PreOrderTraversal(int i)
{
if(Data[i]==Type(-111))
return;
std::cout<<Data[i]<<" ";
PreOrderTraversal(2*i);
PreOrderTraversal(2*i+1);
}
#endif

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38052次
    • 积分:1225
    • 等级:
    • 排名:千里之外
    • 原创:72篇
    • 转载:38篇
    • 译文:0篇
    • 评论:0条