C语言数据结构-用链表的方式构建和遍历二叉树(前、中、后序)

一、链表基本结构

        链表是最基础的数据结构之一,它通过指针将零散的内存块串联起来,形成一个线性序列。

//单链表节点定义
struct ListNode
{
    int data;      //数据域
    struct ListNode* next;     //指针域-指向下一个节点
}

二、二叉树基本结构

        二叉树是每个节点最多有两个子节点的树结构,广泛应用于搜索、排序等场景。

// 二叉树节点定义
struct TreeNode {
    int data;               // 数据域
    struct TreeNode* left;  // 左子节点指针
    struct TreeNode* right; // 右子节点指针
};

三、链表构建二叉树的核心思想

        将链表的“一个next指针”扩展为“两个指针”,分别指向左右子树, 二叉树节点本质上是一个带有两个next指针的链表节点。

四、用链表构建和遍历二叉树C语言代码详解

1.定义二叉树节点结构

#include <stdio.h>
#include <stdlib.h>

//定义类型
struct tree2
{
    struct tree2 *left;   //指针:存左子节点的内存地址
    int data;              //节点存储的数值
    struct tree2 *right;   //指针:存右子节点的内存地址
};
typedef struct tree2 treenode2;    //给 struct tree2 取别名 treenode2
typedef treenode2* btree2;     //给 treenode2 的指针取别名 btree2

2. 定义插入单个节点的函数

//二叉树插入节点
btree2 insert_node(btree2 root,int nodedata)
{
    btree2 newnode = NULL;
    btree2 currentnode = NULL;
    btree2 parentnode = NULL;

    // 1. 创建新节点:分配内存+初始化
    newnode = (btree2)malloc(sizeof(treenode2));
    newnode ->data = nodedata;
    newnode ->left = NULL;
    newnode ->right = NULL;

    // 2. 空树处理,新节点作为根
    if(root == NULL)
    {
        return newnode;
    }

    // 3. 遍历树,找父节点
    currentnode = root;
    parentnode = NULL;

    while(currentnode!=NULL)
    {
        parentnode = currentnode;
        if(nodedata > currentnode ->data)
        {
            currentnode = currentnode -> right;
        }
        else
        {
            currentnode = currentnode -> left;
        }
    }
    // 4. 插入新数值
    if(nodedata > parentnode ->data)
    {
        parentnode ->right = newnode;
    }
    else
    {
        parentnode ->left = newnode;
    }
    return root;
}

3.创建二叉树函数

//链表创建二叉树
btree2 create_tree(int *nodelist,int len)
{
    btree2 root = NULL;        //初始化时数是空的,根为NULL
    for(int i=0;i < len;i++)
    {
        //把数组里的第i个元素插入树中,更新根节点
        root = insert_node(root,nodelist[i]);
    }
    return root;  //返回构建好的树的根节点
}

4.打印二叉树

        前、中、后序的实现逻辑是一样的。

//打印二叉树-前序
void print_qbtree(btree2 root)
{
    if(root != NULL)
    {
        printf("%d",root->data);
        print_qbtree(root->left);
        print_qbtree(root->right);
    }
}
//打印二叉树-中序
void print_zbtree(btree2 root)
{
    if(root != NULL)
    {
        print_zbtree(root->left);
        printf("%d",root->data);
        print_zbtree(root->right);
    }
}
//打印二叉树-后序
void print_hbtree(btree2 root)
{
    if(root != NULL)
    {
        print_hbtree(root->left);
        print_hbtree(root->right);
        printf("%d",root->data);
    }
}

5.主函数main入口

int main()
{
    int nodelist[] = {7,4,5,9,3,2};
    int len = 6;

    //定义btree2类型变量root,存储创建好的树
    btree2 root = create_tree(nodelist,len);

    //打印
    printf("链表二叉树的遍历前顺序:");
    int i;
    for(i=0;i<len;i++)
    {
        printf("%d",nodelist[i]);
    }
    printf("\n");
    printf("链表二叉树的中序遍历结果(左、根、右):");
    print_zbtree(root);
    printf("\n");

    printf("链表二叉树的前序遍历结果(根、左、右):");
    print_qbtree(root);
    printf("\n");

    printf("链表二叉树的后序遍历结果(左、右、根):");
    print_hbtree(root);
    printf("\n");

    return 0;
}

流程

        定义数组 —> 构建二叉树 —> 打印结果。

结果

二叉树结果展示图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值