二叉树的四种遍历方式

 

#include<stdio.h>

#include<stdlib.h>

#include<iostream>

using namespace std;

#define OK 1

#define ERROR 0

typedef int Status;

typedef char TElemType;

//typedef int QElemType;

typedef struct BiNode//定义树的结点

{

      TElemType data;

      struct BiNode* lchild, * rchild;

}BiNode,*BiTree;

typedef struct    QNode { // 结点类型

    TElemType      data;

    struct QNode  *next;

  } QNode, *QueuePtr;

typedef struct

{ // 链队列类型

    QueuePtr  front;  // 队头指针

    QueuePtr  rear;   // 队尾指针

} LinkQueue;

Status InitQueue(LinkQueue& Q)//初始化

{

    Q.front = Q.rear = new QNode;//创建一个节点,Q.front和Q.rear都是指向一个节点,像定义的节点那种构造类型

    Q.front->next = NULL;//队头节点之后就没有了,即为一个空队列

    return OK;

}

Status enQueue(LinkQueue& Q, TElemType e)//将e入队

{

    QNode* p;

    p = new QNode;//对p进行初始化

    p->data = e;

    p->next = NULL;

    Q.rear->next = p;

    Q.rear = p;//在队尾入队

    return OK;

}

Status deQueue(LinkQueue& Q, TElemType& a)//出队,并将之返回给e

{

    QNode *p=new QNode;

    if (Q.front == Q.rear)return ERROR;//空队,没有元素可出了

    p = Q.front->next;//p是首元节点

    a = p->data;//a是首元节点的data域的值

    cout<<a;

    Q.front->next = p->next;//头节点的next域(首元节点)变成了第二元素(首元节点的next域)

    if (Q.rear == p)Q.rear = Q.front;//如果队尾元素是p(首元节点),这个队为空队(只有一个头节点,头指针尾指针都指向它)

    delete p;

    return OK;

}

Status QueueEmpty(LinkQueue& Q)

{

    if (Q.front == Q.rear) { printf("\n空队列"); return OK; }

    else { printf("\n非空队列"); return OK; }

}

//01 构建二叉树的二叉链表

void CreateBiTree(BiTree& T)//先序遍历创建一个树

{

    TElemType ch;

    cin >> ch;

    if (ch == '#') T = NULL;

    else

    {

        T = new BiNode;

        T->data = ch;

        CreateBiTree(T->lchild);

        CreateBiTree(T->rchild);

    }

}

//02 先序遍历二叉树中所有结点;

void PreOrderTraverse(BiTree T)//先序遍历输出二叉树

{

    if (T)

    {

        cout << T->data;

        PreOrderTraverse(T->lchild);

        PreOrderTraverse(T->rchild);

    }

}

//03 中序遍历二叉树中所有结点;

void InOrderTraverse(BiTree T)//中序遍历输出二叉树

{

    if (T)

    {

        InOrderTraverse(T->lchild);

        cout << T->data;

        InOrderTraverse(T->rchild);

    }

}

//04 后序遍历二叉树中所有结点;

void LaOrderTraverse(BiTree T)//后序遍历输出二叉树

{

    if (T)

    {

        InOrderTraverse(T->lchild);

        InOrderTraverse(T->rchild);

        cout << T->data;

    }

}

//05 层次遍历二叉树中所有结点;

void levelOrderTraverse(BiTree T)//层序遍历二叉树

{

    BiNode *p;

    LinkQueue qu;

    InitQueue(qu);

    enQueue(qu,p->data);

    while(!QueueEmpty(qu))

    deQueue(qu,p->data);

    cout<<p->data;

    if(p->lchild!=NULL)

    enQueue(qu,p->lchild->data);

    if(p->rchild!=NULL)

    enQueue(qu,p->rchild->data);

}

int main()

{

    BiTree T;

    printf("二叉树的元素是");

    CreateBiTree(T);

    printf("先序遍历结果");

    PreOrderTraverse(T);

    printf("\n中序遍历结果");

    InOrderTraverse(T);

    printf("\n后序遍历结果");

    LaOrderTraverse(T);

    printf("\n层序遍历结果");

    levelOrderTraverse(T);

}

输入

 

 输出结果为

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值