news 2026/6/10 22:42:48

在C语言中,可以通过**先序遍历的方式输入数据**来创建一个二叉链表表示的二叉树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在C语言中,可以通过**先序遍历的方式输入数据**来创建一个二叉链表表示的二叉树

在C语言中,可以通过先序遍历的方式输入数据来创建一个二叉链表表示的二叉树。通常约定以某个特殊值(如-1)表示空结点,用于标识子树的结束。

🌲 创建思路(递归方式)

根据先序遍历的顺序:根 → 左 → 右,我们依次读入数据:

  • 若输入为-1,表示该子树为空,返回NULL
  • 否则,为当前节点分配内存,赋值,并递归创建左子树和右子树。

✅ C语言实现代码

#include<stdio.h>#include<stdlib.h>// 二叉树结点定义typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;}BiTNode,*BiTree;// 按先序输入数据创建二叉树(-1 表示空结点)voidCreateBiTree(BiTree*root){intval;scanf("%d",&val);if(val==-1){*root=NULL;// 空结点}else{*root=(BiTNode*)malloc(sizeof(BiTNode));if(!*root){printf("内存分配失败!\n");exit(1);}(*root)->data=val;// 设置根节点数据CreateBiTree(&(*root)->lchild);// 递归创建左子树CreateBiTree(&(*root)->rchild);// 递归创建右子树}}// 示例:先序遍历输出验证voidPreOrder(BiTree root){if(root!=NULL){printf("%d ",root->data);PreOrder(root->lchild);PreOrder(root->rchild);}}// 主函数测试intmain(){BiTree T;printf("请输入先序序列构建二叉树(-1 表示空结点):\n");CreateBiTree(&T);printf("先序遍历结果为:");PreOrder(T);printf("\n");return0;}

🧪 输入示例

假设我们要构建如下二叉树:

1 / \ 2 3 / \ 4 5

对应的先序输入序列为(补全空指针用 -1):

1 2 4 -1 -1 5 -1 -1 3 -1 -1

每个-1对应一个空左右孩子,完整反映树结构。


🔍 注意事项

  • 必须严格按照先序结构输入,包括所有叶子结点的左右空指针。
  • 使用指针的地址(BiTree *root)是为了修改实参指针本身。
  • 动态内存分配需检查是否成功,避免野指针或崩溃。

// 一、二叉链表的结点类型定义typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;}BiTNode,*BiTree;// 二、二叉树的遍历方式// 先序遍历:根 → 左 → 右voidPreOrder(BiTree root){if(root!=NULL){printf("%d ",root->data);// 访问根节点PreOrder(root->lchild);// 遍历左子树PreOrder(root->rchild);// 遍历右子树}}// 中序遍历:左 → 根 → 右voidInOrder(BiTree root){if(root!=NULL){InOrder(root->lchild);// 遍历左子树printf("%d ",root->data);// 访问根节点InOrder(root->rchild);// 遍历右子树}}// 后序遍历:左 → 右 → 根voidPostOrder(BiTree root){if(root!=NULL){PostOrder(root->lchild);// 遍历左子树PostOrder(root->rchild);// 遍历右子树printf("%d ",root->data);// 访问根节点}}

通过先序遍历中序遍历序列可以唯一重建一棵二叉树(前提是不含重复值)。

🔍 重建原理

  • 先序遍历:顺序为根 → 左子树 → 右子树,所以第一个元素就是当前子树的根节点
  • 中序遍历:顺序为左子树 → 根 → 右子树,因此可以在中序序列中找到根的位置,从而划分出左右子树的范围。

利用这两个特性,可以递归构造二叉树


✅ 算法步骤

  1. 从先序序列中取出当前根节点(初始为第一个元素)。
  2. 在中序序列中查找该根的位置,将其分为:
    • 左半部分:左子树的中序序列
    • 右半部分:右子树的中序序列
  3. 根据左子树结点数量,确定先序序列中对应的部分。
  4. 递归构建左子树和右子树。

✅ C语言实现代码

#include<stdio.h>#include<stdlib.h>// 二叉树结点定义typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;}BiTNode,*BiTree;// 查找元素在数组中的位置intsearch(intarr[],intstart,intend,intvalue){for(inti=start;i<=end;i++){if(arr[i]==value)returni;}return-1;}// 使用先序和中序序列重建二叉树BiTreebuildTree(intpreorder[],intinorder[],intpreStart,intinStart,intinEnd){if(inStart>inEnd)returnNULL;// 创建根节点(当前先序起点)BiTree root=(BiTNode*)malloc(sizeof(BiTNode));if(!root){printf("内存分配失败!\n");exit(1);}root->data=preorder[preStart];root->lchild=root->rchild=NULL;// 如果没有子树(叶子),直接返回if(inStart==inEnd)returnroot;// 在中序中找根的位置,划分左右子树intinRootIndex=search(inorder,inStart,inEnd,root->data);// 计算左子树结点数intleftSubtreeSize=inRootIndex-inStart;// 递归构建左子树和右子树root->lchild=buildTree(preorder,inorder,preStart+1,inStart,inRootIndex-1);root->rchild=buildTree(preorder,inorder,preStart+leftSubtreeSize+1,inRootIndex+1,inEnd);returnroot;}// 中序遍历验证结果voidInOrder(BiTree root){if(root!=NULL){InOrder(root->lchild);printf("%d ",root->data);InOrder(root->rchild);}}// 先序遍历验证结果voidPreOrder(BiTree root){if(root!=NULL){printf("%d ",root->data);PreOrder(root->lchild);PreOrder(root->rchild);}}// 主函数测试intmain(){intn;printf("请输入节点个数:");scanf("%d",&n);intpreorder[n],inorder[n];printf("请输入先序遍历序列:");for(inti=0;i<n;i++)scanf("%d",&preorder[i]);printf("请输入中序遍历序列:");for(inti=0;i<n;i++)scanf("%d",&inorder[i]);BiTree T=buildTree(preorder,inorder,0,0,n-1);printf("重建完成!\n");printf("先序遍历验证:");PreOrder(T);printf("\n");printf("中序遍历验证:");InOrder(T);printf("\n");return0;}

🧪 示例输入输出

假设:

  • 先序:[1, 2, 4, 5, 3]
  • 中序:[4, 2, 5, 1, 3]

程序将重建如下二叉树:

1 / \ 2 3 / \ 4 5

输出验证:

  • 先序:1 2 4 5 3
  • 中序:4 2 5 1 3

⚠️ 注意事项

  • 所有节点值应不重复,否则search函数可能定位错误。
  • 数组长度需一致,且输入合法。
  • 可优化使用哈希表(如静态映射数组)加速查找(适用于数据范围小的情况)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 1:04:14

从数据到论文图表:lavaan+R实现结构方程模型全流程输出

第一章&#xff1a;结构方程模型与lavaan简介结构方程模型&#xff08;Structural Equation Modeling, SEM&#xff09;是一种强大的多变量统计分析方法&#xff0c;广泛应用于心理学、社会学、管理学和教育研究等领域。它能够同时估计测量关系&#xff08;通过因子分析&#x…

作者头像 李华
网站建设 2026/6/10 19:46:25

R语言处理系统发育数据常见陷阱:90%的人都忽略的3个关键步骤

第一章&#xff1a;R语言系统发育数据处理的核心挑战在系统发育学研究中&#xff0c;R语言因其强大的统计分析能力和丰富的生物信息学包&#xff08;如ape、phytools、ggtree&#xff09;成为数据处理的首选工具。然而&#xff0c;面对复杂的进化树结构与多源异构的生物学数据&…

作者头像 李华
网站建设 2026/6/9 21:19:55

YOLOv8与Flask结合构建Web端检测服务接口

YOLOv8与Flask结合构建Web端检测服务接口 在智能视觉应用日益普及的今天&#xff0c;越来越多的企业希望将训练好的AI模型快速部署为可远程调用的服务。然而&#xff0c;许多开发者仍停留在“本地脚本运行”的阶段——模型只能在自己的电脑上跑通&#xff0c;却难以被前端、移动…

作者头像 李华
网站建设 2026/6/10 15:08:31

YOLOv8数据集配置yaml文件编写标准模板

YOLOv8数据集配置YAML文件编写标准与实践指南 在目标检测项目开发中&#xff0c;一个常被忽视却至关重要的环节是——如何让模型“认识”你的数据。无论你使用的是YOLOv8n这样的轻量级网络&#xff0c;还是部署在边缘设备上的定制化检测器&#xff0c;第一步永远不是调参、不是…

作者头像 李华
网站建设 2026/6/10 19:28:15

YOLOv8 SGD优化器参数配置经验分享

YOLOv8 SGD优化器参数配置经验分享 在当前计算机视觉任务中&#xff0c;目标检测模型的训练效率与最终性能高度依赖于优化策略的选择。尽管近年来自适应优化器如Adam广受欢迎&#xff0c;但在YOLOv8这类工业级实时检测系统中&#xff0c;SGD&#xff08;随机梯度下降&#xff0…

作者头像 李华
网站建设 2026/6/10 18:55:33

YOLOv8实时视频流检测实现方案

YOLOv8实时视频流检测实现方案 在智能安防、工业自动化和交通监控日益普及的今天&#xff0c;如何快速构建一个稳定高效的实时目标检测系统&#xff0c;已成为许多开发者面临的共同挑战。传统部署方式常常被“环境不一致”“依赖冲突”等问题拖慢节奏&#xff0c;而模型本身在精…

作者头像 李华