数据结构遍历

该代码示例展示了如何在C++中使用结构体定义二叉树节点,并实现先序、中序、后序和层序四种遍历二叉树的方法。程序首先通过输入字符序列构建二叉树,然后依次输出四种遍历顺序的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>

#include<iostream>//这两个是c++的头文件,有这两才能使用输入输出 
using namespace std;

//定义一个二叉树 
typedef struct BiTNode
{
    //int data;//这个类型按照自己想输入的为主 
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//定义队列
typedef struct  queue
{
    BiTree data[101];//这个类型?这个data不怕重复? 
    int head;//头指针 
    int tail;//尾指针 
    
}queue; 

//按照先序遍历的方式,构建我们的二叉树,输入的时候,我们要按照完全二叉树的形式输入,结点为空的位置,输入“#”
int createTree(BiTree &T)
{
    char data1;
    //cin>>data1; 
    scanf("%c",&data1);
    if(data1=='#')
    {
        T=NULL;
    }
    else
    {
        T=new BiTNode;//开空间
        T->data=data1;
        createTree(T->lchild); //生成左子树
        createTree(T->rchild); //生成右子树
        
    }
    return 1;
    
}


//先序遍历,根左右 
int PreOrderTraverse(BiTree T)
{
    if(T==NULL)
    return 0;
    else
    {
        //cout<<T->data; 
        printf("%c",T->data);//输出跟结点,即为双亲 
        PreOrderTraverse(T->lchild); //左孩子递归算法 
        PreOrderTraverse(T->rchild);//右孩子递归算法 
        
    }
    return 1; 
}
 
 
 //中序遍历,左根右
int InOrderTraverse(BiTree T)
{
    if(T==NULL)
    return 0;
    else
    {
        InOrderTraverse(T->lchild); //左孩子递归算法 
        printf("%c",T->data);//输出跟结点,即为双亲 
        //cout<<T->data; 
        InOrderTraverse(T->rchild);//右孩子递归算法 
        
    }
    return 1; 
}

 //后序遍历,左右根 
int PostOrderTraverse(BiTree T)
{
    if(T==NULL)
    return 0;
    else
    {
        PostOrderTraverse(T->lchild); //左孩子递归算法 
        //printf("%c",T->data);//输出跟结点,即为双亲 
        PostOrderTraverse(T->rchild);//右孩子递归算法
        cout<<T->data;  
        
    }
    return 1; 
}

//注意这个细节,在这里的放在层序的上面。 
//这个区域关于队的定义,初始化,入队,出队操作
 //队初始化
  int  IntQueue(queue &Q)
  {
      Q.head=Q.tail=0;//这里已经data已经给了存储空间,在这里不需要再分配 
      return 1;
  }
  
  //入队
int EnQueue(queue &Q,BiTree T)
{
    Q.data[Q.tail]=T;//队的队尾指向T结点;
    Q.tail++;
    return 1;
    
}

//出队
int DeQueue(queue &Q,BiTree &t)
{
    t=Q.data[Q.head];
    Q.data[Q.head]=NULL;
    Q.head++;//这样的话没有删除,应该比较浪费空间 
    return 1;
    
 } 


//层序,配合队列处理
 int LevelOrderTraverse(BiTree T)
 {
    queue Q;//对于队来说这里就是主函数区域 
    IntQueue(Q); //队的初始化
    BiTree t;//我觉得在这里弄一个t而不动T是为了防止T丢了 
    EnQueue(Q,T);//入队入队  
    while(Q.head!=Q.tail)
    {
        DeQueue(Q,t);//出队; 
        printf("%c",t->data);   //打印出队元素 
        if(t->lchild!=NULL) //若为空则没必要进行出队
        EnQueue(Q,t->lchild);
        
        if(t->rchild!=NULL)//判断右
        EnQueue(Q,t->rchild);
            
    }
     
     return 1;
 }
 


int main()
{
    //ABC##DE#G##F###
    printf("阿祥玩二叉树\n"); 
    printf("先序构造一棵二叉树(左右孩子为空用#表示)\n"); 
    printf("怎么结束?,好像要填满三层\n"); 
    BiTree T;
    createTree(T);//先序遍历二叉树 
    
    //先序遍历
    //cout<<"先序遍历的序列为"<<endl; //c++写法 
    printf("先序遍历的序列为:\n");
    PreOrderTraverse(T);
    printf("\n\n");
    
    //中序遍历
    printf("中序遍历的序列为:\n");
    InOrderTraverse(T);
    printf("\n\n");
    
    //后序遍历
    printf("后序遍历的序列为:\n");
    PostOrderTraverse(T);
    printf("\n\n");
    //层序遍历
    //层序遍历得配合队来操作,队是以先进先出,先出队第一个根结点然后入队 左右孩子
    //然后左作为根结点出队,再将左的两个孩子入队,这样就得到层序效果 
    
    printf("层序遍历的序列为:\n");
    LevelOrderTraverse(T);
    printf("\n\n");
    printf("敲完耗时两个半小时\n");
    printf("收工干饭\n");
    
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值