您的位置:首页 > 理论基础 > 数据结构算法

数据结构之C/C++实现二叉树的链式存储

2018-07-24 15:03 931 查看
/**
* 2018年7月20日16:51:54
* 二叉树的链式存储
*/
#include <malloc.h>
#include <iostream>
#include <string>
using namespace std;

typedef char ElemType;//结点数据域的类型
#define MaxSize 15
//二叉树的链式存储结构
typedef struct BiTNode {
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

//树指针的队列
typedef struct {
BiTree data[MaxSize];
int front, rear;
} SqQueue;

//创建二叉树
//ab c  d  ;
//120300400;
bool CreateBiTree(BiTree &T) {
ElemType s;
cout << "请输入一个字母:";
cin >> s;
if(s=='0') {
exit(-1);
}
if(s=='#') {
T = NULL;
} else {
//创建结点
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = s;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return true;
}

//前序遍历
bool PreOrder(BiTree &T) {
if(T==NULL) {
return 0;
}
cout <<"结点的值为:"<< T->data <<endl;
PreOrder(T->lchild);
PreOrder(T->rchild);
return true;
}

//中序遍历
bool InOrder(BiTree &T) {
if(T==NULL) {
return 0;
}
InOrder(T->lchild);

cout <<"结点的值为:"<< T->data <<endl;

InOrder(T->rchild);
return true;
}

//后序遍历
bool PostOrder(BiTree &T) {
if(T==NULL) {
return 0;
}
PostOrder(T->lchild);
PostOrder(T->rchild);
cout <<"结点的值为:"<< T->data <<endl;
return true;
}

//初始化循环队列
void InitQueue(SqQueue &Q){
Q.front = Q.rear = 0;
}
//判断队空
bool IsEmpty(SqQueue &Q){
if(Q.front==Q.rear){
return true;
}else {
return false;
}
}

//入队一个元素
bool EnQueue(SqQueue &Q, BiTree x){
//判断队是否满
if(Q.front==(Q.rear+1)%MaxSize){
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)%MaxSize;

return true;
}

//出队一个元素
bool DeQueue(SqQueue &Q, BiTree &x){
//判断队列是否为空
if(Q.front==Q.rear){
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}

//层次遍历
void LeverOrder(BiTree &T) {
SqQueue Q;
InitQueue(Q);
BiTree p;
EnQueue(Q, T);
//将根结点入队
while(!IsEmpty(Q)) {
DeQueue(Q, p);
cout <<"层次遍历为:"<< p->data << endl;
//如果出队结点左孩子不空,进队
if(p->lchild!=NULL) {
EnQueue(Q, p->lchild);
}
//如果出队结点右孩子不空,进队
if(p->rchild!=NULL) {
EnQueue(Q, p->rchild);
}
}
}

int main() {
BiTree T;
cout << CreateBiTree(T)<< endl;
PreOrder(T); //前序遍历:abcd(1234)
InOrder(T);  //中序遍历:bcad(2314)
PostOrder(T);//后序遍历:cbda(3241)
LeverOrder(T);//层次遍历:abdc(1243)
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: