二叉树的建立与遍历

编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。 编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。 ⑴ 实验要求 ① 假设二叉树的结点值是字符,请分别根据输入的两棵二叉树的先序遍历序列和中序遍历序列来建立二叉链表表示的两棵二叉树。 ② 分别利用先序、中序和后序遍历方法来实现判断两棵二叉树是否相等的操作。 ③ 主程序中要求设计一个菜单,允许用户通过菜单来多次选择执行利用哪一种遍历方法来判断两棵二叉树是否相... 阅读详情

二叉树代码出自:《C语言入门经典(第四版)》第11章 --结构化数据:

/* Sorting integers using a binary tree */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/* Function prototypes */
struct Node *createnode(long value);                  /* Create a tree node */
struct Node *addnode(long value, struct Node* pNode); /* Insert a new node  */
void listnodes(struct Node *pNode);                   /* List all nodes     */
void freenodes(struct Node *pNode);                   /* Release memory     */

/* Defines a node in a binary tree sotring integers */
struct Node
{
  long item;                 /* The data item            */
  int count;                 /* Number of copies of item */
  struct Node *pLeft;        /* Pointer to left node     */
  struct Node *pRight;       /* Pointer to right node    */
};

/* Function main - execution starts here */
int main(void)
{
  long newvalue = 0;
  struct Node *pRoot = NULL;
  char answer = 'n';
  do
  {
    printf("Enter the node value: ");
    scanf(" %ld", &newvalue);
    if(pRoot == NULL)
      pRoot = createnode(newvalue);
    else
    addnode(newvalue, pRoot);
    printf("\nDo you want to enter another (y or n)? ");
    scanf(" %c", &answer);
  } while(tolower(answer) == 'y');

  printf("The values in ascending sequence are: ");
  listnodes(pRoot);          /* Output the contents of the tree */
  freenodes(pRoot);          /* Release the heap memory         */

  return 0;
}

struct Node *createnode(long value)
{
  struct Node *pNode = (struct Node *)malloc(sizeof(struct Node));
  pNode->item = value;                      /* Set the value          */
  pNode->count = 1;                         /* Set the count          */
  pNode->pLeft = pNode->pRight = NULL;      /* No left or right nodes */
  return pNode;
}

/* Add a new node to the tree */
struct Node *addnode(long value, struct Node* pNode)
{
  if(pNode == NULL)                        /* If there's no node              */
    return createnode(value);              /* ...create one and return it     */

  if(value ==pNode->item)
  {                                        /* Value equals current node       */
    ++pNode->count;                        /* ...so increment count and       */
    return pNode;                          /* ...return the same node         */
  }

  if(value < pNode->item)                  /* If less than current node value */
  {
    if(pNode->pLeft == NULL)               /* and there's no left node        */
    {
      pNode->pLeft = createnode(value);    /* create a new left node and      */
      return pNode->pLeft;                 /* return it.                      */
    }
    else                                   /* If there is a left node...      */
      return addnode(value, pNode->pLeft); /* add value via the left node     */
  }
  else                                     /* value is greater than current   */
  {
    if(pNode->pRight == NULL)              /* so the same process with        */
    {                                      /* the right node.                 */
      pNode-> pRight = createnode(value);
      return pNode-> pRight;
    }
    else
      return addnode(value, pNode-> pRight);
  }
}

/* List the node values in ascending sequence */
void listnodes(struct Node *pNode)
{
  if(pNode->pLeft != NULL)
    listnodes(pNode->pLeft);

  for(int i = 0; i<pNode->count ; i++)
    printf("\n%10ld", pNode->item);

  if(pNode->pRight != NULL)
    listnodes(pNode->pRight);
}

/* Release memory allocated to nodes */
void freenodes(struct Node * pNode)
{
  if(pNode == NULL)                    /* If there's no node...        */
    return;                            /* we are done.                 */

  if(pNode->pLeft != NULL)             /* If there's a left sub-tree   */
    freenodes(pNode->pLeft);           /* free memory for those nodes. */

  if(pNode->pRight != NULL)            /* If there's a right sub-tree  */
    freenodes(pNode->pRight);          /* free memory for those nodes. */

  free(pNode);                         /* Free current node memory     */
}


输出:

注意:只允许在 C99 模式下使用‘for’循环初始化声明,要使用C99标准来编译

#cc -std=c99 binarytree.c

二叉树的存储、遍历、建立 二叉树的存储: 1、顺序存储: 对于一般的二叉树,添加一些空结点,使之成为完全二叉树的形式。按照完全二叉树 2、二叉链表: 阅读详情

相关推荐

C++根据前序遍历建立二叉树与三种遍历操作

在看到数据结构二叉树部分时,想利用C++实现二叉树的建立与遍历操作,在参考部分网上代码后,自己进行了总结,直接贴代码: 首先要实现一个二叉树类,主要操作有三:1.创建二叉链表节点结构体 2.前序建立二叉树 3.三种遍历操作。 class BiTree /*这是一个最基本的二叉树类,所有的操作都在这个类里实现*/ { public: BiTree()/*默认构造函数,对根节点进行初始化操作*/ { root = new BiTreeNode(-1,nullptr,nullptr); } struc

bilibili_fx的博客 2809

C语言 数据结构 之 链式栈

栈的链式存储结构简称为 链式栈 链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点(相当于头插法),出栈一个元素,释放一个节点。 链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现。 1. 链式栈的结点结构

weixin_40933653的博客 4539

二叉树的递归建立和遍历

二叉树建立及遍历 一、实验目的: 1) 掌握二叉树的概念和基本操作。 2) 掌握二叉树的创建和遍历。 3) 通过本实验可以使学生掌握二叉树的相关算法和概念。 4) 培养解决实际问题、编写程序的能力。 二、实验内容 生成二叉树(必作) 递归先序遍历该二叉树(遍历算法三选一) 递归中序遍历该二叉树(遍历算法三选一) 非递归先序遍历该二叉树(遍历算法三选一) 三、实验步骤 1、

sunlanchang的博客 1737

单链表的基本操作

学过数据结构都知道,链表是最基础的一个数据结构。作为一个合格的程序员都应该清楚链表的操作。 一、什么是链表呢? 我的理解是,链表是有每个结点的组成的一种线性表,每个结点的物理存储单元是不连续的,但是这些结点能通过指针找到下一个结点的位置。 结点是什么呢?我来画一个图解释一下。 每个结点都是由数据域和指针域组成的,数据域中存放个的是这个结点的一些信息,指针域存放的是下一个结点的地址,这个...

技术小白的博客 1507

告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例)

本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。

weixin_30336061的博客 311

GD32F303驱动WS2812B灯带:用TIMER+PWM+DMA解放CPU,实现流畅灯效(附完整代码)

本文详细介绍了基于GD32F303的TIMER+PWM+DMA全自动控制方案,用于高效驱动WS2812B灯带。通过硬件外设协同工作,该方案不仅解放了CPU资源,还能实现复杂的灯光效果,如渐变、流水等。文章提供了完整的代码实现和性能优化技巧,适合嵌入式开发者参考。

weixin_42561143的博客 380

二叉查找树的各项操作(重点是结点的删除部分和递归的运用)

大半年前学二叉树时,看不懂删除结点的代码,对递归的理解很浅,今天把问题一并解决,加深对递归的理解。          1.删除结点的算法描述:如果待删除的结点至多只有一个子结点,那么需要删除的就是这个结点本身,通过改变指针指向即可;如果待删除的结点有2个结点,那么就需要删除这个结点在中序遍历时的直接后继结点,再通过赋值完成删除。删除后要记得释放结点空间。          2.递归:递归在非线

Neil的博客 3101

springcloud+nacos+gateway+oauth2小聚会

在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。

ldcaws的专栏 2646

C语言对链表的基本操作(1、创建表 2、创建节点 3、表头插入 4、表尾插入 5、打印表)

1. 链表的结构体定义(结点定义) 链表的一个结点首先肯定包含一个数据域和一个指针域,数据域用来存放结点数据,指针域存放的是指向下一个结点的地址。当然,头节点例外,其实,头结点和普通结点一样,只不过头结点只存放了指向下一个结点的地址(即首结点)。 2、创建节点 为插入做准备,学习数据的时候,一定要把功能划分明确 3、表头插入 // 插在头结点之后 插队插入,不能越过头结点 // 插队插入,不能越过头结点 只需要强调一点,头插法是在头结点尾部,尾插法是在链表尾部插入,这个不要理解错了。其...

weixin_40933653的博客 4245

BUPT软件安全实验三

可以看出栈溢出对程序运行的安全性有很大的威胁,如果不对栈进行保护,只要系统中存在栈溢出漏洞,即可令攻击者通过非正当方法获取操作权限。(6)解决思考题,即:在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。查看缓冲区信息,可以看到dest指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。

7xun's space 1966

ESP32-S3数字麦克风入门:手把手教你用Arduino IDE读取MSM261S4030H0R的I2S数据

本文详细介绍了如何使用Arduino IDE读取MSM261S4030H0R数字麦克风的I2S数据,涵盖硬件连接、代码编写和数据可视化全流程。重点解决I2S引脚配置、环境噪声过滤和声波观察等实际问题,适合ESP32-S3开发者快速上手数字麦克风应用。

weixin_26742753的博客 318

c语言之单链表的创建与应用

1.定义结构体 #include //定义结构体 struct node{ int data; struct node* next; }; 2.创建链表 struct node* creatlist() { struct node* headnode = (struct node*)malloc(sizeof(struct node)); //headnode 成为了结构体变量 //变量使用前必须被初始化 //headnode->dat..

m0_59998867的博客 655

硅基半导体量子点:单电子自旋量子比特技术手册

现在我们已经了解了从硅片到容错计算的全部环节,让我们用一张总览图把碎片拼成完整拼图。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;important;important;important;color:#000!important;important;important;important;important;color:#000!

VectorShift的博客 372

二叉树的建立与遍历详解

1、二叉树的建立与遍历分布详解 定义二叉树结构体: typedef struct BinaryTreeNode { TelemType data; struct BinaryTreeNode *Left; struct BinaryTreeNode *Right; }Node; 创建二叉树: Node* createBinaryTree() { Node ...

floating_fight的博客 6014

4D毫米波雷达:高度信息与微多普勒效应

4D毫米波雷达:高度信息与微多普勒效应​ ,人工智能,计算机视觉,大模型,AI,本文深入解析4D毫米波雷达的高度信息获取与微多普勒效应。4D毫米波雷达通过MIMO技术、垂直天线布局及相位差计算等获取高度信息,相较传统雷达更精准。微多普勒效应由目标微运动引发,可用于目标识别、分类和运动监测。文中结合自动驾驶、安防监控案例,分析技术挑战与未来趋势,如信号干扰、数据处理复杂,未来将向高精度、与其他传感器融合发展,展现出在多领域的巨大应用潜力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 556

建立一个二叉树及遍历二叉树的步骤(C语言)

建立一个简单二叉树的基本步骤

qq_49175846的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

二叉树的建立及其递归遍历(C语言实现)

本文转载自二叉树的建立及其递归遍历(C语言实现) 最近在学习数据结构中树的概念,迟迟不得入门,应该是自己的懒惰和没有勤加练习导致的,以后应该多加练习 以下是我对二叉树的一些总结内容 二叉树的特点有: - 每一个节点最多有两棵子树,所以二叉树中不存在度大于2的节点,注意,是最多有两棵,没有也是可以的 左子树和右子树是有顺序的,次序不能颠倒,这点可以在哈夫曼编码中体现, 顺序不同编码方式不同...

zhc的博客 7282

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言二叉树建立与遍历—实验报告

系别计算机学院班级学号姓名课程名称数据结构实验日期实验名称二叉树的建立与遍历算法应用成绩实验目的:熟悉掌握二叉链表存储结构及基本算法,并能应用二叉树的基本算法解决与之有关的简单问题,训练和提高结构化程序设计能力及程序调试能力。实验条件:计算机一台,Visual C++6.0或DEV C++判断一棵二叉树是否为满二叉树。要求二叉树用二叉链表存储,用先序、中序、后序递归遍历算法的任意两种输出二叉树中所有结点,编写程序判断该树是否为满二叉树。int val;// 结点的值。

冰小九的博客 2411

python二叉树的建立和遍历

python二叉树 二叉树的建立: # -*- coding : utf-8 -*- class Node: def __init__(self,value=None,left=None,right=None): self.value = value self.left = left self.right = right if __name__ =='__main__': root...

Stupid-Tyro的博客 2281

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树——编写函数实现:建立二叉树、中序递归遍历、借助栈实现中序非递归遍历、借助队列实现层次遍历、求高度、结点数、叶子数及交换左右子树。("."表示空子树)#include #include //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LC

Footmart_C的博客 1295

【数据结构】二叉树的建立及先中后序遍历完整C语言代码

二叉树的先中后序遍历二叉树的建立先序遍历中序遍历后序遍历程序结果 二叉树的建立 我们知道,建立一个二叉树,可以写出它的先序遍历,后序遍历,中序遍历。本文根据先序序列建立一个二叉树,以字符#表示空结点。先序序列的二叉树如下图所示。(ABD##E##CF###) 比如我们知道这样的一个二叉树 想要建立这个二叉树二叉树,我们就要依次从键盘输入 ABD##E##CF###。 这样,我们就建立好了一个二叉树,接下来就是输出该二叉树,分别通过先序遍历,中序遍历,后序遍历输出该二叉树。 先序遍历 //先序遍历 void

九芒星的博客 1万+

数据结构(二叉树)——二叉树的建立、存储、遍历

建立二叉树,并通过调用函数,,输出先序遍历、中序遍历与后序遍历的结果 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 //DataType 是二叉树数据元素类型,此程序定义为char型 typedef char DataType; typedef struct Node { Data

haha_7的博客 933

二叉树的建立、三种(递归、非递归)遍历方法

二叉树定义: 1.有且仅有一个特定的称之为根root的结点 2.当n>1时,除根结点之外的其余结点分为两个互不相交的子集。他们称为二叉树的左子树和右子树。 二叉树的一种建立方法: 若对有n个结点的完全二叉树进行顺序编号(1=1)的结点。 当i=1时,该结点为根,它无双亲结点; 当i>1时,该节点的双亲编号为[i/2]; 若2i 当2i+1 利用上个性质,对任意二叉树,先按满二叉树

尽人事,听天命 2230
上一篇: C语言文件操作函数大全
下一篇: B树建立与遍历
unix21
博客等级 码龄14年 115粉丝 248原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值