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

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

//linearbintree.h
#ifndef LINEARBINTREE_H
#define LINEARBINTREE_H
#include 
#include 
const int TREEMAXSIZE=100;
template
class LinearBinTree
{
private:
Type Data[TREEMAXSIZE];
int last;
public:
LinearBinTree():last(0){
for(int i=0;i
bool LinearBinTree::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
void LinearBinTree::Print()
{
for(int i=1;i<=last;i++)
{
if(Data[i]==Type(-111))
continue;
std::cout<
void LinearBinTree::PreOrderTraversal()
{
LinearBinTree::PreOrderTraversal(1);
}
template
void LinearBinTree::PreOrderTraversal(int i)
{
if(Data[i]==Type(-111))
return;
std::cout<

你可能感兴趣的:(二叉树的顺序存储结构的C++实现)