C实现前序遍历二叉树

article/2025/9/17 16:50:55

1. 实验目的

(1)掌握二叉树的逻辑结构;

(2)掌握二叉树的二叉链表存储结构;

(3)验证二叉树的二叉链表存储及遍历操作。

2. 实验目的

(1)建立一棵含有n个结点的二叉树,采用二叉链表存储;

(2)输出前序遍历该二叉树的遍历结果。

3. 实验提示

       定义二叉树的数据类型——二叉树结点结构体BiNode,在BiNode基础上实现题目要求的建立二叉链表、前序遍历等基本操作。建立二叉链表可以采用扩展二叉树的一个遍历序列,例如前序序列,将扩展二叉树的前序序列由键盘输入,建立该二叉树的二叉链表存储。

       简单起见,本实验假定二叉树的数据元素为char型,要求学生:

     (1)将实验程序调试通过后,用模板类改写;

     (2)加入层序遍历二叉树等基本操作。

4. 程序代码

#include<stdlib.h>
#include<stdio.h>typedef char ElemType;//二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(分别指向左右孩子)typedef  struct BiTNode
{ElemType data;struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;//二叉树的建立,按前序遍历的方式建立二叉树,当然也可以以中序或后序的方式建立二叉树
void CreateBiTree(BiTree *T)
{ElemType ch;scanf_s("%c",&ch);if (ch == '#')*T = NULL;  //保证是叶结点else{*T = (BiTree)malloc(sizeof(BiTNode));//if (!*T)//exit(OVERFLOW); //内存分配失败则退出。(*T)->data = ch;//生成结点CreateBiTree(&(*T)->lchild);//构造左子树CreateBiTree(&(*T)->rchild);//构造右子树    }
}
//表示对遍历到的结点数据进行的处理操作,此处操作是将树结点前序遍历输出
void operation1(ElemType ch)
{printf("%c\n",ch);
}
//此处在输出的基础上,并输出层数
void operation2(ElemType ch, int level)
{printf("%c在第%d层\n",ch,level);
}
//递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T, int level)
{if (T == NULL)return;/*此处表示对遍历的树结点进行的操作,根据你自己的要求进行操作,这里只是输出了结点的数据*///operation1(T->data);operation2(T->data, level); //输出了层数PreOrderTraverse(T->lchild, level + 1);PreOrderTraverse(T->rchild, level + 1);
}//递归方式中序遍历二叉树void InOrderTraverse(BiTree T, int level)
{if (T == NULL)return;InOrderTraverse(T->lchild, level + 1);//operation1(T->data);operation2(T->data, level); //输出了层数InOrderTraverse(T->rchild, level + 1);
}//递归方式后序遍历二叉树void PostOrderTraverse(BiTree T, int level)
{if (T == NULL)return;PostOrderTraverse(T->lchild, level + 1);PostOrderTraverse(T->rchild, level + 1);//operation1(T->data);operation2(T->data, level); //输出了层数
}int main()
{int level = 1; //表示层数BiTree T = NULL;printf("请以前序遍历的方式输入扩展二叉树:"); //类似输入AB#D##C##CreateBiTree(&T);// 建立二叉树,没有树,怎么遍历printf("递归前序遍历输出为:\n");PreOrderTraverse(T, level);//进行前序遍历,其中operation1()和operation2()函数表示对遍历的结点数据进行的处理操作printf("\n");printf("递归中序遍历输出为:\n");InOrderTraverse(T, level);printf("\n");printf("递归后序遍历输出为:\n");PostOrderTraverse(T, level);printf("\n");system("pause");return 0;
} 

5. 运行结果

6. 实验心得

       通过这次实验,我对前序、中序、后续遍历二叉树有了更深的理解,我充分掌握了了递归算法的运行过程与实现,掌握了常用递归算法的算法思想与使用,更全面的认识了计算机中程序运行的过程。


http://chatgpt.dhexx.cn/article/Xr43rHAM.shtml

相关文章

前序序列创建二叉树

7-9 前序序列创建二叉树 &#xff08;25 分&#xff09; 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是…

按照前序遍历创建二叉树及树的四种遍历方式

一.二叉树的介绍 二叉树的特点是二叉树的每个结点的度都不大于2&#xff0c;可以视为每个结点都有左孩子和右孩子。故二叉树结点的数据结构为 二.二叉树的特点 1.设根结点所在的层数为第1层&#xff0c;则第i层最多有个结点。 2.深度为k的二叉树最多有个结点。 3.对任何一个二叉…

LeetCode 144. 二叉树的前序遍历(前序遍历)

文章目录 1. 题目信息2. 解题2.1 递归2.2 循环&#xff0c;必须掌握 1. 题目信息 给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例:输入: [1,null,2,3] 1\2/3 输出: [1,2,3]进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 来源&#xff1a;力…

589. N 叉树的前序遍历(javascript)589. N-ary Tree Preorder Traversal

给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 Given the root of an n-ary tree, return the preorder traversal of its n…

python中while用法

python中while用法 例子&#xff1a; a1 while a<10:print(a)a2输出结果&#xff1a; 这段代码的意思是&#xff1a;a的初始值是1&#xff0c;判断条件是&#xff1a;如果a<10&#xff0c;则打印a&#xff0c;之后在返回的a的基础上加2&#xff0c;&#xff0c;如果a&…

while函数用法 matlab,Matlab(七)while循环的使用

Rate this post 在前一节课我们学习了if判断语句&#xff0c;在这篇博客&#xff0c;我们来学习循环语句&#xff1a;while 在此先打出一段简单的while循环代码&#xff1a; x1; while x<4 disp(x); x x1; end 在这段代码中&#xff0c;先声明x 1 当X < 4的时候&#x…

【JAVA】while的用法。

public class While { public static void main(String[] args) {//while 循环语句//不断重复完成某件工作&#xff0c;有明确的结束条件//for do whileint num0;//计数器while(num<10){ if(num%21){ num;continue;}//num为比6大的偶数时&#xff0c;循环结束if(num…

while在Java用法_while和do-while的使用方法

while循环开始后&#xff0c;先判别条件能否满足&#xff0c;假如满足就执行循环体内的语句&#xff0c;执行终了后再回来判别条件能否满足&#xff0c;如此无限反复&#xff1b;直到条件不满足时&#xff0c;执行while循环后边的语句。简单来讲就是说while循环是先判别后循环&…

y-在C语言while语句中的意义,c语言while用法(C语言while用法)

C语言while用法 需要稍作修改 #include main() { 5261int a,b,c,d; double e0.0; //这里e要初始化 a1,b1,c1; //b要从1开始&#xff0c;要不然第一个算4102不上 while(b<100) { ec*1.0/b;//要不然是整数1653除以整数&#xff0c;值是整数&#xff0c;也就是0 bb1; c-c; } pr…

php do while(),php do while用法详解

php do while是一种循环语句&#xff0c;该循环语句保证会执行一次&#xff0c;其使用语法如【<?php $i 0;do {echo $i;} while ($i > 0);?>】&#xff0c;其循环语句将正好运行一次。 推荐&#xff1a;《PHP视频教程》 do-while (PHP 4, PHP 5, PHP 7) do-while 循…

while在c语言中的作用,while的用法_C语言中while的用法

c语言中while的用法 当n==1时执行while循环结构里的语句,当n不等于1时,则跳过该循环执行循环体外的语句。 while 循环的格式:while (表达式){语句;} while 循环的执行顺序:当表达式为真,则执行下面的语句,语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的…

PHP中用while的用法,php while语句的用法

在php中while语句指的是while循环语句&#xff0c;用于重复执行代码块&#xff0c;直到指定的条件不成立&#xff0c;其语法是【while (条件){要执行的代码;}】。 推荐&#xff1a;《PHP视频教程》 php while 循环 while 循环将重复执行代码块&#xff0c;直到指定的条件不成立…

三种循环语句的详解和使用(for,while,do-while)

对于刚接触编程的小可爱们&#xff0c;肯定会碰到这三种循环&#xff0c;书上写的有可能会过于专业化&#xff0c;会让我们感觉很难理解&#xff0c;在这里我就用最简洁明了的表达方式帮你理解并且学会使用这三种循环。 对于大佬们&#xff0c;读完你也许会新体会&#xff0c;新…

IO流(字符流)

IO流&#xff08;字符流&#xff09; 字符流 一.字符流是什么 字符流是可以直接读取字符的IO流字符流读取字符&#xff0c;就要先读去到字节数据&#xff0c;然后转为字符&#xff0c;如果要写出字符&#xff0c;需要把字符转为字节再写出 FileReader FileReader类的read(…

javaIO之字符流

目录 一、简介二、字符流入流1.1FileReader构造方法1.2FileReader读取字符数据 三、字符流出流3.1 FileWriter 构造方法3.2FileWriter写入数据3.3关闭close和刷新flush3.4FileWriter的续写和换行3.5文本文件复制 四、IO异常处理五、小结 一、简介 字符流 Reader 和 Writer 的故…

字符流定义及如何深入理解字符流的编码

IputSrem类和OupuSrem类在读写文件时操作的都是字节&#xff0c;如果希望在程序中操作字符&#xff0c;使用这两个类就不太方便&#xff0c;为此JDK提供了字符流。同字节流样&#xff0c;字符流也有两个抽象的顶级父类&#xff0c;分别是Reader和Writer其中&#xff0c;Reader是…

Java:字符流

字符流的底层其实就是字节流。 字符流字节流字符集 结构体系&#xff1a; 1.特点 输入流:一次读一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节。 输出流:底层会把数据按照指定的编码方式进行编码&#xff0c;变成字节再写到文件中。 2.使用场景 对于纯文本…

java的字符流

字符流的底层也是字节流。字符流字节流字符集。 特点是输入流一次读一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节&#xff08;读多少个与字符集有关&#xff09;&#xff1b;输出流底层会把数据按照指定的编码方式进行编码&#xff0c;变成字节再写到文件中。 字…

java字符流

前言 输入流&#xff1a;把数据&#xff08;键盘输入、鼠标、扫描仪等等外设设备&#xff09;读入到内存&#xff08;程序&#xff09;中 输出流&#xff1a;把内存&#xff08;程序&#xff09;中的数据输出到外设或其他地方&#xff0c;从文件角度简单总结就是&#xff0c;输…