2021-08-19 二叉树的操作

本文详细介绍了如何使用C语言实现二叉树的创建、递归和非递归遍历(先序、中序、后序),包括使用栈实现的非递归遍历算法。通过实例展示了先序、中序和后序遍历的输出结果。

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

二叉树的创建以及递归和非递归遍历

包含:先序、中序、后序遍历操作
代码中使用二叉树的样式

// 二叉树的创建和遍历
#include <stdio.h>
#include <stdlib.h>

typedef struct treeNode
{
    char data;
    struct treeNode* LChild;
    struct treeNode* RChild;
}TREE,*LPTREE;

// 创建一个结点
LPTREE createNode(char data)
{
    LPTREE newNode = (LPTREE)malloc(sizeof(TREE));
    newNode->data = data;
    newNode->LChild = NULL;
    newNode->RChild = NULL;
    return newNode;
}
//结点之间的连接
void insertNode(LPTREE parentNode,LPTREE LChild,LPTREE RChild)
{
    parentNode->LChild = LChild;
    parentNode->RChild = RChild;
}

// 打印
void printNode(LPTREE curData)
{
    printf("%c  ",curData->data);
}
// 先序遍历  根 左 右
void preOrder(LPTREE root)
{
    if(root != NULL)
    {
        printNode(root);
        preOrder(root->LChild);
        preOrder(root->RChild);
    }
}

// 中序遍历 左 根 右
void midOrder(LPTREE root)
{
    if(root != NULL)
    {
        midOrder(root->LChild);
        printNode(root);
        midOrder(root->RChild);
    }
}

// 后序遍历  左 右 根
void lastOrder(LPTREE root)
{
    if(root != NULL)
    {
        lastOrder(root->LChild);
        lastOrder(root->RChild);
        printNode(root);
    }
}
// 非递归方式遍历二叉树(采用栈)
// 非递归先序遍历
void preOrderByStack(LPTREE root)
{
    if(root == NULL)
    {
        return;
    }
    // 准备顺序栈
    LPTREE stack[10];     //存储每次打印结点的位置
    int stackTop = -1;    //栈顶标记
    LPTREE  pMove = root; //从根结点开始
    while(stackTop != -1 || pMove)
    {
        // 根 左 右
        // 打印走过的结点并且把走过的结点入栈
        while(pMove)
        {
            printf("%c  ",pMove->data);
            stackTop++;
            stack[stackTop] = pMove;
            pMove = pMove->LChild;
        }
        // 左边无路可走处理右边
        if(stackTop != -1)
        {
            pMove = stack[stackTop];
            stackTop--;
            pMove = pMove->RChild;

        }
    }
}

// 非递归方式中序遍历
// 先移动到最左边,把走过的数据入栈 无路可走时 出栈
void minOrderByStack(LPTREE root)
{
    if(root == NULL)
    {
        return;
    }
    // 准备顺序栈
    LPTREE stack[10];     //存储每次打印结点的位置
    int stackTop = -1;    //栈顶标记

    // 定义移动的指针
    LPTREE pMove = root;
    while (stackTop != -1 || pMove)
    {
        // 走到最左边把走过的元素入栈
        while (pMove)
        {
            stackTop++;
            stack[stackTop] = pMove;
            pMove = pMove->LChild;

        }
        //出栈
        if (stackTop != -1)
        {
            pMove = stack[stackTop];
            printf("%c  ",pMove->data);
            stackTop--;
            pMove = pMove->RChild;
        }
    }
}

// 非递归方式后序遍历
void lastOrderByStack(LPTREE root)
{
    if (root == NULL)
    {
        return;
    }
    // 准备顺序栈
    LPTREE stack[10];     //存储每次打印结点的位置
    int stackTop = -1;    //栈顶标记

    // 定义移动的指针
    LPTREE pMove = root;
    LPTREE pLastVisit = NULL;

    while (pMove)
    {
        stackTop++;
        stack[stackTop] = pMove;
        pMove = pMove->LChild;   //一直往左边
    }
    while (stackTop != -1)
    {
        pMove = stack[stackTop];
        stackTop--;
        if( pMove->RChild == NULL || pMove->RChild == pLastVisit)
        {
            printf("%c  ",pMove->data);
            pLastVisit = pMove; //改变标记的位置
        }
        else
        {
           stackTop++;
           stack[stackTop] = pMove;
           pMove = pMove->RChild;
           while (pMove)
           {
               stackTop++;
               stack[stackTop] = pMove;
               pMove = pMove->LChild;
           }
        }
    }
}
int main()
{
    LPTREE A = createNode('A');
    LPTREE B = createNode('B');
    LPTREE C = createNode('C');
    LPTREE D = createNode('D');
    LPTREE E = createNode('E');
    LPTREE F = createNode('F');
    LPTREE G = createNode('G');
    LPTREE H = createNode('H');
    insertNode(A,B,F);
    insertNode(B,NULL,C);
    insertNode(F,NULL,G);
    insertNode(C,D,E);
    insertNode(G,H,NULL);

    printf("先序遍历:\n");
    preOrder(A);
    printf("\n非递归方式先序遍历:\n");
    preOrderByStack(A);

    printf("\n中序遍历:\n");
    midOrder(A);
    printf("\n非递归方式中序遍历:\n");
    minOrderByStack(A);

    printf("\n后序遍历:\n");
    lastOrder(A);
    printf("\n非递归方式后序遍历:\n");
    lastOrderByStack(A);


    printf("\n");
    system("pause");
    return 0;
}

结果输出如下:
先序遍历:
A B C D E F G H
非递归方式先序遍历:
A B C D E F G H
中序遍历:
B D C E A F H G
非递归方式中序遍历:
B D C E A F H G
后序遍历:
D E C B H G F A
非递归方式后序遍历:
D E C B H G F A
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值