首页 > 编程语言 >二叉树的链式存储结构 C++代码实现

二叉树的链式存储结构 C++代码实现

时间:2023-08-27 11:39:04浏览次数:40  
标签:递归 sqStack C++ Sq BiTNode BT 二叉树 链式 void


/*二叉树的链式存储结构*/

 
#include <iostream>
using namespace std;


/*二叉链表的定义*/
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;

}BiTNode;  

 
typedef BiTNode * BiTree;

//***************************************************
//***************************************************

/*顺序栈的定义*/

typedef struct sqStack
{
       BiTNode **elem;//栈里面应该存放的是BiTNode数据的指针,也就是地址,而不是BiTNode型的数据
       int top;
       int stackSize;

}sqStack;


/*顺序栈的初始化*/
void initStack_Sq(sqStack &S)
{
       S.elem=new BiTNode*[100];//应该分配(BiTNode * )型的空间
       S.top=-1;
       S.stackSize=100;
}

/*入栈*/
void push_Sq(sqStack &S,BiTNode * x)//此处形参应该为指针型的。
{

       if(S.top==99)
              cout<<"Stack Overflow!";
       else
       {
              S.top++;
              S.elem[S.top]=x;
       }

}

/*出栈*/
BiTNode * pop_Sq(sqStack &S)//此处返回值也应该是指针型的
{

       BiTNode * x;
       if(S.top==-1)
              cout<<"Stack Empty!";
       x=S.elem[S.top];
       S.top--;
       return x;

}

//*******************************************************
//*******************************************************

/*按先序序列,用递归算法创建二叉链表*/
BiTree CreatBiTree_Pre(BiTree &BT)
{

       char ch;
 
       cin>>ch;
       if(ch=='0')
              BT=NULL;//如果是空格字符,则表示为空树。
       else
       {
              BT=new BiTNode;
              BT->data=ch;//生成根结点
              CreatBiTree_Pre(BT->lchild);//递归建立左子树,不能写成BT->lchild=CreatBiTree_Pre(BT),递归应该在现有的基础上进行递归。牢记此形式!!!

              CreatBiTree_Pre(BT->rchild);//递归建立右子树
       }
       return 0;

}

/*前序递归遍历*/
void PreOrder_Re(BiTree &BT)
{

       if(BT)
       {
              cout<<BT->data<<" ";
              PreOrder_Re(BT->lchild);
              PreOrder_Re(BT->rchild);
       }

}

/*中序递归遍历*/
void InOrder_Re(BiTree &BT)
{

       if(BT)
       {
              InOrder_Re(BT->lchild);
              cout<<BT->data<<" ";
              InOrder_Re(BT->rchild);

       }

}


/*前序非递归遍历*/
void PreOrder_NRe(BiTree &BT)
{

       BiTNode *p;
       sqStack S;
       initStack_Sq(S);

       p=BT;

       while(p||!(S.top==-1))
       {
              if(p)
              {
                     push_Sq(S,p);
                     cout<<p->data<<" ";
                     p=p->lchild;
              }
              else
              {
                     p=pop_Sq(S);
                     p=p->rchild;
              }
       }
       cout<<endl;

}


/*中序非递归遍历*/
void InOrder_NRe(BiTree &BT)
{

       BiTNode *p;
       sqStack S;
       initStack_Sq(S);
       p=BT;

       while(p||!(S.top==-1))
       {
              if(p)
              {
                     push_Sq(S,p);
                     p=p->lchild;
              }
              else
              {
                     p=pop_Sq(S);
                     cout<<p->data<<" ";
                     p=p->rchild;
              }
       }
       cout<<endl;
}

void main()
{

       BiTree BT;

       //creatBiTree(BT);
       CreatBiTree_Pre(BT);

       //PreOrder_NRe(BT);
       InOrder_NRe(BT);
       InOrder_Re(BT);

       cout<<endl;

       PreOrder_NRe(BT);
       PreOrder_Re(BT);

       cout<<endl;

}

 

标签:递归,sqStack,C++,Sq,BiTNode,BT,二叉树,链式,void
From: https://blog.51cto.com/u_5173797/7251967

相关文章

  • 二叉树用顺序表实现 C++代码实现
    /*二叉树用顺序表实现*/#include<iostream>usingnamespacestd;/*完全二叉树顺序表的定义*/#defineMAX_BITREE_SIZE100typedefintSqBiTree[MAX_BITREE_SIZE];/*创建一个二叉树顺序表*/voidCreateBiTree(SqBiTree&T){inti;cout<<"输入元素个数:";......
  • 哈夫曼树及哈夫曼编码 C++代码实现
     /*哈夫曼编码*/#include<iostream>usingnamespacestd;//********************************//构造哈夫曼树//********************************/*哈夫曼树顺序表的定义*/typedefstruct{intweight;intparent,lchild,rchild;}HTNode;typedefH......
  • 稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现
    /*稀疏矩阵的压缩存储及转置*/#include<iostream>usingnamespacestd;/*三元组顺序表的类型定义*/#defineitemSize100typedefstruct{introw,col;intitem;}thNode;typedefstruct{thNode*data;//data[0]不用intm,n,t;//分别表示行数、列......
  • 选择排序——简单选择排序和堆排序,C++代码实现
    #include<iostream>usingnamespacestd;typedefstruct{ intr[100+1]; intlength;}SqList;//简单选择排序voidSimpleSlectSort(SqList&L){ intmin,i,j; for(i=1;i<L.length;i++) { min=i; for(j=i+1;j<=L.length;j++) if(L.r[j]<L.r[m......
  • 循环队列的定义、入队、出队等操作 C++代码实现
    #include<iostream>usingnamespacestd;/*循环队列的类型定义*/constintQueue_Size=100;typedefstructcirclQueue{char*elem;intrear;intfront;intqueueSize;}circlQueue;/*初始化*/voidinitQueue_C(circlQueue&......
  • 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现
     #include<iostream>usingnamespacestd;/*顺序栈的定义*/#defineStack_Size100typedefstructsqStack{char*elem;inttop;intstackSize;//栈数组长度}sqStack;/*顺序栈的初始化*/voidinitStack_Sq(sqStack&S){S.elem=ne......
  • 用线性表实现的通讯录管理 C++代码
    /****************************************//*主控菜单处理测试程序main2.c************//***************************************/#include<iostream>#include<string>usingnamespacestd;#defineLIST_INIT_SIZE100#defineLISTINCREMENT10intOK=......
  • 用单链表实现一元多项式相加 C++代码
     #include<iostream>usingnamespacestd;/*结点的定义*/typedefstructLNode{floatcoef;intexp;structLNode*next;}LNode;typedefLNode*Polynomial;/*多项式的初始化*/voidinitDuoX(Polynomial&Px){Px=newLNode;......
  • 双链表的定义、初始化、插入、删除,C++代码实现的算法
    #include<iostream>usingnamespacestd;/*双向链表类型定义*/typedefstructduNode{chardata;structduNode*prior;structduNode*next;}duNode;typedefduNode*duLinklist;//指针类型,故访问它的成员用“->”。/*初始化双向链表*/voidinitLinkl......
  • 链队列的实现,C++代码实现
    /*链队列的实现*/#include<iostream>usingnamespacestd;/*链队列类型定义*/typedefstructQNode{structQNode*next;chardata;}QNode,*queuePtr;//结点的定义typedefstructlinkQueue{queuePtrrear;queuePtrfront;}linkQueue;//队列的定......