数据结构——顺序存储二叉树

来源:互联网 发布:linux grep -w 编辑:程序博客网 时间:2024/05/16 08:50
#include <iostream>using namespace std;#define MAX_NODE_SIZE 100         //二叉树的最大节点数typedef char SqBiTree[MAX_NODE_SIZE+1];        //0号单元节点个数//创建二叉树void creat_tree(SqBiTree &t){    int i=0;    char ch;    while((ch=getchar())!='$')    {        i++;        t[i]=ch;    }    t[0]=i;}//获取给定结点(位置)的左孩子的结点位置int LeftChild_locate(SqBiTree &t,int node) {    if ((2 * node) > t[0])        return -1;    else         return 2 * node;}//获取给定结点(位置)的右孩子的结点位置int RightChild_locate(SqBiTree &t,int node) {    if ((2 * node+1) > t[0])        return -1;    else         return 2 * node+1;}//层序遍历void level_order(SqBiTree &t){    for(int i=1;i<=t[0];i++)        if(t[i]!='#')            cout<<t[i]<<" ";}//先序遍历void pre_order(SqBiTree &t,int i){    if(t[0]<=0)    {        cout<<"空树!"<<endl;    }    else    {        if(t[i]!='#')            cout<<t[i]<<" ";        if(LeftChild_locate(t,i)!=-1)    //如果左子结点存在,递归            pre_order(t,LeftChild_locate(t,i));        if(RightChild_locate(t,i)!=-1)    //如果右子结点存在,递归            pre_order(t,RightChild_locate(t,i));    }}//中序遍历void mid_order(SqBiTree &t,int i){    if(t[0]<=0)    {        cout<<"空树!"<<endl;    }    else    {        if(LeftChild_locate(t,i)!=-1)    //如果左子结点存在,递归            mid_order(t,LeftChild_locate(t,i));        if(t[i]!='#')            cout<<t[i]<<" ";        if(RightChild_locate(t,i)!=-1)    //如果右子结点存在,递归            mid_order(t,RightChild_locate(t,i));    }}//后序遍历void back_order(SqBiTree &t,int i){    if(t[0]<=0)    {        cout<<"空树!"<<endl;    }    else    {        if(LeftChild_locate(t,i)!=-1)    //如果左子结点存在,递归            back_order(t,LeftChild_locate(t,i));        if(RightChild_locate(t,i)!=-1)    //如果右子结点存在,递归            back_order(t,RightChild_locate(t,i));        if(t[i]!='#')            cout<<t[i]<<" ";    }}int main(){    cout<<"创建二叉树:"<<endl;    SqBiTree sbt;    //创建顺序二叉树    creat_tree(sbt);    //层序遍历    level_order(sbt);    cout<<endl;    //先序遍历    pre_order(sbt,1);    cout<<endl;    //中序遍历    mid_order(sbt,1);    cout<<endl;    //后续遍历    back_order(sbt,1);    cout<<endl;    cout<<LeftChild_locate(sbt,3);    return 0;}