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

原创 2016年06月01日 20:14:08

本以为二叉树的顺序存储结构实现非常简单,类似于线性表,而在实际操作当中遇到了一些小问题,首先是如何判别树节点是否为空,我采用的方法初始化数组值为-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

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 线性表顺序存储结构

随着逐渐学习,更深入的体会了C是面向过程,C++是面向对象这一说法。下面的代码用类封装了一个顺序存储的线性表,仅供参考,有错误请指教,毕竟新手。 将元素类型定义为别名,可以方便更改。对于顺序表,最基...
  • LLLCSDN
  • LLLCSDN
  • 2015年12月09日 15:16
  • 2085

C++数组实现最简单的二叉树

二叉树可以用数组方式去实现,也可以用链表方式去实现。链表方式有点难,这里先用数组方式实现最简单的二叉树的-建立树,删除节点,增加节点,遍历节点,查找节点等。 头文件中构建类的代码,在CPP文件中实现,...
  • CV_YOU
  • CV_YOU
  • 2016年10月03日 13:38
  • 1299

二叉树顺序存储的实现

在实现二叉树的顺序存储的过程中,遇到了一些问题,现记录如下:#include #include #include #define OK 1 #define ERROR 0 #define TRUE 1...

使用C++数组实现二叉树的存储和基本操作

1、创建文件ArrayTree.h 定义二叉树的数据结构 #ifndef ARRAYTREE_H #define ARRAYTREE_H class ArrayTree{ public: A...

二叉树的建立(顺序存储)

数据结构编程练习(六) 题目: 1)能够调用递归函数读取相应的数据建立二叉树,相应数据格式自行设计;  2)实现先序、中序、后序遍历二叉树 3)求取二叉树中的所有结点数 4)求取二叉树的深度 输入如...

二叉树的顺序存储和链式存储

作为一个机械屌丝男,最近一直在恶补
  • bbewx
  • bbewx
  • 2014年05月25日 11:03
  • 3275

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

关于二叉树的顺序存储和链式存储

【出处】http://book.51cto.com/art/200907/134251.htm 3.2.2  二叉树的顺序存储结构和链式存储结构 (1)二叉树的顺序存储结构 按照...
  • fynjy
  • fynjy
  • 2015年07月28日 21:08
  • 2839

数据结构之树的三种存储结构

说道存储结构,我们就会

使用C++链表来实现二叉树的存储和基本操作

1、创建Node.h 定义链表的节点 #ifndef NODE_H #define NODE_H class Node{ public: Node(); Node* searchNo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的顺序存储结构的C++实现
举报原因:
原因补充:

(最多只允许输入30个字)