二叉树的顺序存储结构的C++实现
2016-06-01 20:14
603 查看
本以为二叉树的顺序存储结构实现非常简单,类似于线性表,而在实际操作当中遇到了一些小问题,首先是如何判别树节点是否为空,我采用的方法初始化数组值为-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
//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
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- 浅析顺序结构存储的栈
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)