408之二叉树(一)

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.7k人参与

       今天学习了二叉树的层次建树和深度优先遍历算法,现在将实现的代码分享如下:

1. 二叉树结构定义

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

// 二叉树节点定义
typedef char bielemtype;
typedef struct bitree
{
    bielemtype data;               // 节点数据域
    struct bitree* lchild, * rchild; // 左右子节点指针
}bitree, * pbitree;

// 辅助队列节点定义(用于层次建树)
typedef struct tag
{
    pbitree p;                    // 指向二叉树节点
    struct tag* next;             // 队列下一个节点指针
}tag, * ptag;

2. 二叉树遍历实现

// 前序遍历:根->左->右
void preorder(pbitree tree)
{
    if (tree != NULL)
    {
        printf("%c", tree->data);  // 先访问根节点
        preorder(tree->lchild);    // 递归遍历左子树
        preorder(tree->rchild);    // 递归遍历右子树
    }
}

// 中序遍历:左->根->右
void midorder(pbitree tree)
{
    if (tree != NULL)
    {
        midorder(tree->lchild);    // 递归遍历左子树
        printf("%c", tree->data);  // 访问根节点
        midorder(tree->rchild);    // 递归遍历右子树
    }
}

// 后序遍历:左->右->根
void postorder(pbitree tree)
{
    if (tree != NULL)
    {
        postorder(tree->lchild);   // 递归遍历左子树
        postorder(tree->rchild);   // 递归遍历右子树
        printf("%c", tree->data);  // 最后访问根节点
    }
}

3. 二叉树层次建树实现

// 二叉树层次建树主函数
int main()
{
    pbitree pnew;                  // 新创建的二叉树节点
    bielemtype c;                  // 读取的输入字符
    pbitree tree = NULL;           // 二叉树根节点
    
    // 辅助队列指针(用于层次建树)
    ptag head = NULL, tail = NULL; // 队列头尾指针
    ptag pcur = NULL;              // 当前处理的队列节点
    ptag list_pnew = NULL;         // 新创建的队列节点

    while (scanf("%c", &c))        // 循环读取输入字符
    {
        if (c == '\n')             // 遇到换行符结束输入
        {
            break;
        }
        
        // 创建新二叉树节点
        pnew = (pbitree)calloc(1, sizeof(bitree));
        pnew->data = c;
        
        // 创建对应的队列节点
        list_pnew = (ptag)calloc(1, sizeof(tag));
        list_pnew->p = pnew;

        // 处理第一个节点(根节点)
        if (tree == NULL)
        {
            tree = pnew;           // 设置根节点
            head = list_pnew;      // 初始化队列
            tail = list_pnew;
            pcur = list_pnew;
            continue;
        }
        else
        {
            tail->next = list_pnew; // 新节点加入队列尾部
            tail = list_pnew;
        }

        // 将新节点挂载到当前处理的父节点
        if (pcur->p->lchild == NULL)
        {
            pcur->p->lchild = pnew; // 挂载到左子树
        }
        else if (pcur->p->rchild == NULL)
        {
            pcur->p->rchild = pnew; // 挂载到右子树
            pcur = pcur->next;      // 当前父节点已满,移动到队列下一个节点
        }
    }

    // 输出三种遍历结果
    preorder(tree);
    printf("\n");
    midorder(tree);
    printf("\n");
    postorder(tree);
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值