二叉树的创建与遍历(递归版本)

简介:

非递归方式实现二叉树的创建与搜索,对于二叉树通常约定以前序遍历方式输入,若输入不正确是不会有什么显示的,这点要注意;

给出了C语言创建链表的俩种方式(不同于C++中引用传递)

一 创建二叉树方式:

方式一:输入指针

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void creatBT(BiTree *T)//建立一个二叉树  
  2. {  
  3.     char ch;  
  4.     scanf("%c",&ch);//读入字符  
  5.     if(ch=='.')//.代表空子树  
  6.         *T = NULL;  
  7.     else  
  8.     {  
  9.         *T = (node *)malloc(sizeof(node));  
  10.         if(!T)  
  11.         {  
  12.             printf("开辟内存失败\n");  
  13.             exit(1);  
  14.         }  
  15.         (*T)->data = ch;//给T赋值  
  16.         creatBT(&(*T)->lchild);//给左子树赋值  
  17.         creatBT(&(*T)->rchild);//给右子树赋值  
  18.     }  
  19. }  

方式二:无参数传入,返回局部函数的指针地址

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. BiTree creatBT()//建立一个二叉树  
  2. {  
  3.     BiTree T;  
  4.     char ch;  
  5.     scanf("%c",&ch);//读入字符  
  6.     if(ch=='.')//.代表空子树  
  7.         T = NULL;  
  8.     else  
  9.     {  
  10.         T = (node *)malloc(sizeof(node));  
  11.         if(!T)  
  12.         {  
  13.             printf("开辟内存失败\n");  
  14.             exit(1);  
  15.         }  
  16.         T->data = ch;//给T赋值  
  17.         T->lchild = creatBT();//给左子树赋值  
  18.         T->rchild = creatBT();//给右子树赋值  
  19.     }  
  20.     return T;  
  21. }  

二 遍历代码(采取方式一的创建方式)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. //定义二叉树的数据结构(递归方式)  
  4. typedef struct node  
  5. {  
  6.     char data;  
  7.     struct node *lchild;  
  8.     struct node *rchild;  
  9. }node ,*BiTree;  
  10. void creatBT(BiTree *T)//建立一个二叉树  
  11. {  
  12.     char ch;  
  13.     scanf("%c",&ch);//读入字符  
  14.     if(ch=='.')//.代表空子树  
  15.         *T = NULL;  
  16.     else  
  17.     {  
  18.         *T = (node *)malloc(sizeof(node));  
  19.         if(!T)  
  20.         {  
  21.             printf("开辟内存失败\n");  
  22.             exit(1);  
  23.         }  
  24.         (*T)->data = ch;//给T赋值  
  25.         creatBT(&(*T)->lchild);//给左子树赋值  
  26.         creatBT(&(*T)->rchild);//给右子树赋值  
  27.     }  
  28. }  
  29. void pre_order(node *T)//前序遍历二叉树  
  30. {  
  31.     if(T)  
  32.     {  
  33.         printf("%c ",T->data);  
  34.         pre_order(T->lchild);  
  35.         pre_order(T->rchild);  
  36.     }  
  37.   
  38. }  
  39. void mid_order(node *T)//中序遍历  
  40. {  
  41.     if(T)  
  42.     {  
  43.         mid_order(T->lchild);  
  44.         printf("%c ",T->data);  
  45.         mid_order(T->rchild);  
  46.     }  
  47.   
  48. }  
  49. void back_order(node *T)  
  50. {  
  51.     if(T)  
  52.     {  
  53.         back_order(T->lchild);  
  54.         back_order(T->rchild);  
  55.         printf("%c ",T->data);  
  56.     }  
  57.   
  58. }  
  59. int main()  
  60. {  
  61.     BiTree T = NULL;  
  62.     printf("请使用前序遍历的方式输入字符串,用.代替空值\n");  
  63.     creatBT(&T);//建立二叉树  
  64.     printf("建树成功\n");  
  65.     printf("\n前序遍历的结果是:\n");  
  66.   
  67.     pre_order(T);  
  68.     printf("\n中序遍历的结果是:\n");  
  69.     mid_order(T);  
  70.     printf("\n后序遍历的结果是:\n");  
  71.     back_order(T);  
  72.     printf("\n");  
  73.     system("pause");  
  74.     return 0;  
  75. }  


若要采取方式二的创建方式main函数对应修改为

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int main()  
  2. {  
  3.     BiTree T = NULL;  
  4.     printf("请使用前序遍历的方式输入字符串,用.代替空值\n");  
  5.     T = creatBT();//建立二叉树  
  6.     printf("建树成功\n");  
  7.     printf("\n前序遍历的结果是:\n");  
  8.   
  9.     pre_order(T);  
  10.     printf("\n中序遍历的结果是:\n");  
  11.     mid_order(T);  
  12.     printf("\n后序遍历的结果是:\n");  
  13.     back_order(T);  
  14.     printf("\n");  
  15.     system("pause");  
  16.     return 0;  
  17. }  

结果一样的

小结:采用有参传入的时候由于在局部函数执行完后变量都会被释放,因此需要传入BiTree的指针,因而比较复杂,建议使用无参书传入,返回头节点,代码比较简洁容易理解


转载:http://blog.csdn.net/xsf50717/article/details/40019023

目录
相关文章
|
4天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23313 2
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
6天前
|
人工智能 API 开发工具
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
Claude Code是我目前最推荐的AI编程工具,没有之一。 它可能不是最简单的,但绝对是上限最高的。一旦跑通安装、接上模型、定好规范,你会发现很多原本需要几小时的工作,现在几分钟就能搞定。 这套方案的核心优势就三个字:可控性。你不用依赖任何不稳定服务,所有组件都在自己手里。模型效果不好?换一个。框架更新了?自己决定升不升。 这才是AI时代开发者该有的姿势——不是被动等喂饭,而是主动搭建自己的生产力基础设施。 希望这篇保姆教程,能帮你顺利上车。做出你自己的作品。
8907 18
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
|
13天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
4969 24
|
9天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
3498 12
|
8天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
2822 9
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
25天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
20673 63
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)