二叉树的遍历(前,中,后,层序遍历)

引子:二叉树有着广泛的应用,而二叉树的遍历是很重要的,其中包括(前,中,后,层序遍历);什么是二叉树的前,中,后,层序?

问题:什么是二叉树的前,中,后,层序?

解释:

前序是“根左右”

中序是“左根右”

后序是“左右根”

层序是“一层一层,从上到下”

注意:前序有许有多种情况,但是可能是一样的排序,包括中后一样!

图解:

如下是一个数的前中后序层序遍历:

代码实现:

次重点:

首先,我们先创建一个树:(在这里我简单给个数组来存储一个数上的节点数据)

char a={ a,b,c,#,#,d,e,#,g,#,#,f,#,#,#};

int b={1,3,4,6,5,7,8,4,54};

铁汁们,你想要那个就用哪个!我用char好了,Int比较常见!

int main()
{
    char a[100];
    scanf("%s", a);
    return 0;
}

ok,我们输入数据;char a={ a,b,c,#,#,d,e,#,g,#,#,f,#,#,#};

共有代码!

// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root)
{
    if (root == NULL)
    {
        printf("N    ");
        return;
    }
    printf("%c  ", root->_data);
    BinaryTreePrevOrder(root->_left);
    BinaryTreePrevOrder(root->_right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
    if (root == NULL)
    {
        printf("N   ");
        return;
    }
    BinaryTreeInOrder(root->_left);
    printf("%c  ", root->_data);//根的打印
    BinaryTreeInOrder(root->_right);
}
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
    if (root == NULL)
    {
        printf("N   ");
        return;
    }
    BinaryTreePostOrder(root->_left);
    BinaryTreePostOrder(root->_right);
    printf("%c  ", root->_data);
}

效果:

重点:层序遍历!

层序遍历是通过队列实现的!

首先,解释:

1进入队列,1出去时,带进2,3

2出去时带入4,5

3出去时带入6

4出去时带入7

5出去时带入8

void BinaryTreeLevelOrder(BTNode* root)
{
    Queue qu;
    BTNode* cur;
    QueueInit(&qu);//初始化
    QueuePush(&qu, root);//添加头结点
    while (!QueueIsEmpty(&qu)) / /为空直接跳出循环
    {
        cur = QueueTop(&qu);
        putchar(cur->_data);
        if (cur->_left)//如果有左子树,push
        {
            QueuePush(&qu, cur->_left);
        }
        if (cur->_right)//如果有右子树,push
        {
            QueuePush(&qu, cur->_right);
        }
        QueuePop(&qu);//出掉头节点
    }
    QueueDestory(&qu);//进行销毁!
}

补充:

对于队列如下:注意应该把Int 变为 BTreeNode型

以下是queue的cpp文件!

// 初始化队列 
void QueueInit(Queue* q)
{
    assert(q);
    q->_front = q->_rear = NULL;
    q->size = 0;
}
// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
    assert(q);
    //二种情况!
    QNode* tmp = (QNode*)malloc(sizeof(QNode));
    if (tmp == NULL)
    {
        perror("malloc fail!");
        return;//或exit(1)
    }
    tmp->_data = data;
    tmp->_next = NULL;
    if (q->_rear)//此时不为空
    {
        q->_rear->_next = tmp;
        q->_rear = q->_rear->_next;
    }
    else//此时为空
    {
        q->_front = q->_rear = tmp;
    }
    q->size++;
}
// 队头出队列 
void QueuePop(Queue* q)
{
    assert(q);
    //也分二种情况
    //此时也要判断一下盖队列是否为空
    assert(q->_rear);//直接暴力解决!
    if (q->_rear->_next == NULL)
    {
        q->_front = q->_rear = NULL;
    }
    else//此时不止一个数据!
    {//常规思路
        QNode* cur = q->_front->_next;
        free(q->_front);
        q->_front = cur;
    }
    q->size--;
}
// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
    assert(q);
    assert(q->_rear);
    return q->_front->_data;
}
// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
    assert(q);
    assert(q->_rear);
    return q->_rear->_data;
}
// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
    assert(q);
    assert(q->_rear);
    return q->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)//此处爷可以用bool型
{
    assert(q);
    assert(q->_rear);
    return q->size;
}
// 销毁队列 
void QueueDestroy(Queue* q)//要一个一个销毁!
{
    assert(q);
    assert(q->_rear);
    QNode* cur = q->_front;
    while (cur)
    {
        QNode* next = cur->_next;
        free(cur);
        cur = next;
    }
    q->_front = q->_rear = NULL;
    q->size = 0;
}

就到这里啦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值