1、二叉树的存储结构
二叉树是非线性结构,即每个数据结点至多只有一个前驱,但可以有多个后继。它可采用顺序存储结构和链式存储结构。
(1)顺序存储结构
二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点,一般用于完全二叉树。代码如下:
#define Maxsize 100 //假设一维数组最多存放100个元素
typedef char Datatype; //假设二叉树元素的数据类型为字符
typedef struct
{
Datatype bt[Maxsize];
int btnum;
}Btseq;
(2)
链式存储结构
通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:
其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表。代码如下:
typedef char BTElemType; //定义二叉树元素的数据类型为字符
typedef struct BiTNode //定义结点由数据域,左右指针组成
{
BTElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
关于二叉树的遍历这里主要采用链式存储结构进行实现。
2、二叉树的建立
建立二叉树需要将原始二叉树转化未扩展二叉树,扩展二叉树就可以做到一个遍历序列确定一颗二叉树了。可以参考这篇博客用递归方法建立二叉树。
通常会采用前序遍历的方式来实现二叉树的建立,当然也可以采用中序或者后序遍历的方式来实现,如此则对应的扩展二叉树则不相同。前序遍历实现二叉树建立的代码如下:
int CreateBTree(BiTree &T) //根据前序输入二叉树结点中的值
{
BTElemType data;
cin>>data;
if(data == '#')
T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode)); //生成根结点
T->data = data;
CreateBTree(T->lchild); //构造左子树
CreateBTree(T->rchild); //构造右子树
}
return 0;
}
3、二叉树的遍历
遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为三种方式:前序遍历,中序遍历,后序遍历。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
另外还有一种层次遍历,因为不常见,在此不作讨论。
(1)前序遍历
void PrePrint(BiTree &T)
{
if(T!=NULL)
{
if(T->data != '#')
cout<<T->data<<" ";
PrePrint(T->lchild);
PrePrint(T->rchild);
}
}
(2)中序遍历
void MidPrint(BiTree &T)
{
if(T!=NULL)
{
MidPrint(T->lchild);
if(T->data != '#')
cout<<T->data<<" ";
MidPrint(T->rchild);
}
}
(3)后序遍历
void PostPrint(BiTree &T)
{
if(T!=NULL)
{
PostPrint(T->lchild);
PostPrint(T->rchild);
if(T->data != '#')
cout<<T->data<<" ";
}
}
综合程序清单
#include<iostream>
using namespace std;
typedef char BTElemType;
typedef struct BiTNode
{
BTElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreateBTree(BiTree &T) //根据前序输入二叉树结点中的值
{
BTElemType data;
cin>>data;
if(data == '#')
T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode)); //生成根结点
T->data = data;
CreateBTree(T->lchild); //构造左子树
CreateBTree(T->rchild); //构造右子树
}
return 0;
}
void PrePrint(BiTree &T)
{
if(T!=NULL)
{
if(T->data != '#')
cout<<T->data<<" ";
PrePrint(T->lchild);
PrePrint(T->rchild);
}
}
void MidPrint(BiTree &T)
{
if(T!=NULL)
{
MidPrint(T->lchild);
if(T->data != '#')
cout<<T->data<<" ";
MidPrint(T->rchild);
}
}
void PostPrint(BiTree &T)
{
if(T!=NULL)
{
PostPrint(T->lchild);
PostPrint(T->rchild);
if(T->data != '#')
cout<<T->data<<" ";
}
}
int main()
{
BiTree T;
CreateBTree(T);
cout<<"前序遍历结果:";
PrePrint(T);
cout<<endl;
cout<<"中序遍历结果:";
MidPrint(T);
cout<<endl;
cout<<"后序遍历结果:";
PostPrint(T);
cout<<endl;
system("pause");
return 0;
}
参考资料