二叉树的构建及遍历

目录

  • 题目
    • 题目要求
    • 示例
  • 解答
    • 方法一、
      • 实现思路
      • 时间复杂度和空间复杂度
      • 代码
    • 方法二、
      • 实现思路
      • 时间复杂度和空间复杂度
      • 代码

题目

二叉树的构建及遍历

题目要求

在这里插入图片描述
题目链接

示例

解答

方法一、

先构建二叉树,再中序遍历。

实现思路

按照给出的字符串创建二叉树,先依次访问字符串中的字符,如果遇到不为’#'的字符,就将该结点的值赋值为该字符,然后再创建两个新结点,分别为该结点的左孩子和右孩子,然后递归调用方法,使左孩子和右孩子进行同样操作。如果遇到#字符,就将该结点堆顶值赋值为#,然后直接退出函数,即不再创建该结点的左右孩子结点。

时间复杂度和空间复杂度

代码

#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
//定义二叉树的结点
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;void CreateBinaryTree(BTNode* root, char** arr)
{//如果**arr为'\0',则说明字符串已经结束if (*(*arr) == '\0'){return;}//如果**arr不为#,就将该结点的值为**arr,同时让(*arr)++//此时arr里面存的还是*arr的地址,但是(*arr)++后,*arr中存的地址已经为字符串中下一个字符的地址。if (*(*arr) != '#'){root->data = *(*arr);(*arr)++;}//如果**arr为#,就将该结点的值为#,然后同样将*arr中存的地址向后移一位。else{root->data=*(*arr);(*arr)++;return;}//如果该结点不为空结点,就创建两个结点,来当作该结点的左右孩子。BTNode* left = (BTNode*)malloc(sizeof(BTNode));BTNode* right = (BTNode*)malloc(sizeof(BTNode));root->left = left;root->right = right;//然后递归使该结点的左右孩子完成上述同样操作。CreateBinaryTree(root->left, arr);CreateBinaryTree(root->right, arr);
}
void InOrder(BTNode* root)
{//如果root结点的值为#,就说明该结点为空结点,不需要打印,直接退出函数if (root->data=='#'){return;}//先遍历该结点的左子树InOrder(root->left);//然后再打印该节点的值printf("%c ", root->data);//然后再遍历该结点的右子树InOrder(root->right);
}
int main() {char arr[100] = { 0 };scanf("%s", arr);//创建二叉树的根节点BTNode* bt = (BTNode*)malloc(sizeof(BTNode));//将字符串中第一个字符的地址赋值给pachar* pa = &arr[0];//将指针pa的地址赋给ppa,即ppa为二级指针,通过*ppa就可以得到pa,即得到字符串中第一个字符的地址。//当*ppa+1时,即*ppa+1指向字符串的第二个字符的地址,所以可以通过*ppa++来访问字符串的每个字符char** ppa = &pa;//将二叉树根节点和ppa当作实参CreateBinaryTree(bt, ppa);InOrder(bt);return 0;
}

方法二、

比第一种方法更简洁易懂

实现思路

和第一种方法相似,都是先按照给出的先序遍历的顺序创建二叉树,然后进行中序遍历。

时间复杂度和空间复杂度

代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef char BTDataType;
//定义二叉树的结点
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;//创建一个二叉树结点并返回
BTNode* BuyBTNode(BTDataType x)
{BTNode* newNode = (BTNode*)malloc(sizeof(BTNode));newNode->data=x;newNode->left=NULL;newNode->right=NULL;return newNode;
}BTNode* CreateBinaryTree(char* arr,int* count)
{//如果现在访问的字符为#,则说明该结点为NULL,让(*count)++,即访问下一个字符,然后返回NULLif(arr[*count]=='#'){(*count)++;return NULL;}//如果现在访问的字符不为#,将该字符存入到新创建的结点中,BTNode* root = BuyBTNode(arr[(*count)++]);//然后再将该结点的左孩子和右孩子递归调用该函数//如果该结点有左孩子,则会返回创建的新结点//如果该结点没有左孩子,则会返回NULLroot->left = CreateBinaryTree(arr, count);root->right = CreateBinaryTree(arr, count);//然后将根结点返回return root;
}
void InOrder(BTNode* root)
{if(root==NULL){return ;}InOrder(root->left);printf("%c ",root->data);InOrder(root->right);
}
int main()
{char arr[100]={0};scanf("%s",arr);int count = 0;//CreateBinaryTree函数会返回创建的二叉树的根节点BTNode* bt = CreateBinaryTree(arr, &count);InOrder(bt);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/61827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式定时任务框架选型,讲的太好了

1. 前言 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批&#xff0c;进行一天清算&#xff0c;每月1号进行上个月清算电商整点抢购&#xff0c;商品价格8点整开始优惠12306购票系统&#xff0c;超过30分钟没有成功支付订单的&#xff0c;进行回收处理商品成…

.netcore grpc截止时间和取消详解

一、截止时间概述 截止时间功能让 gRPC 客户端可以指定等待调用完成的时间。 超过截止时间时&#xff0c;将取消调用。 设定一个截止时间非常重要&#xff0c;因为它将提供调用可运行的最长时间。它能阻止异常运行的服务持续运行并耗尽服务器资源。截止时间对于构建可靠应用非…

【Git】(六)子模块跟随主仓库切换分支

场景 主仓库&#xff1a;TestGit 子模块&#xff1a;SubModule 分支v1.0 .gitmodules文件 [submodule "Library/SubModule"]path Library/SubModuleurl gitgitee.com:sunriver2000/SubModule.gitbranch 1.0.0.0 分支v2.0 .gitmodules文件 [submodule "Li…

用Socket实现网络通信

文章目录 背景网络编程网络编程三要素 2.DatagramSocket之UDP通信程序2.1 UDP发送数据2.2UDP接收数据2.3 3. Socket之TCP通信程序3.1TCP发送数据3.2TCP接收数据 背景 网络编程 ● 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线…

IP网络广播系统有哪些优点

IP网络广播系统有哪些优点 IP网络广播系统有哪些优点&#xff1f; IP网络广播系统是基于 TCP/IP 协议的公共广播系统&#xff0c;采用 IP 局域网或 广域网作为数据传输平台&#xff0c;扩展了公共广播系统的应用范围。随着局域网络和 网络的发展 , 使网络广播的普及变为可能 …

《Flink学习笔记》——第十一章 Flink Table API和 Flink SQL

Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08;DataSet API&a…

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书

RDMA QP数量和RDMA性能

QP数量上升性能下降 ​​​​​​https://icnp21.cs.ucr.edu/papers/icnp21camera-paper30.pdf 在现代云数据中心中&#xff0c;大规模分布式应用通常构建在许多机器上&#xff0c;需要使用大量并发连接进行频繁的网络通信[4]–[6]。但是&#xff0c;RDMA的性能会随着连接数的…

自动化运维工具-----Ansible入门详解

目录 一.Ansible简介 什么是Ansible&#xff1f; Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构&#xff08;yum安装为例&#xff09; ansibl…

信息安全-应用安全-蚂蚁集团软件供应链安全实践

8月10日&#xff0c;由悬镜安全主办、以“开源的力量”为主题的DSS 2023数字供应链安全大会在北京国家会议中心隆重召开。蚂蚁集团网络安全副总经理程岩出席并发表了《蚂蚁集团软件供应链安全实践》主题演讲。 图1 蚂蚁集团网络安全副总经理程岩发表主题演讲 以下为演讲实录&am…

阿里云 MSE 助力开迈斯实现业务高增长背后带来的服务挑战

开迈斯新能源科技有限公司于 2019 年 5 月 16 日成立&#xff0c;目前合资股东分别为大众汽车&#xff08;中国&#xff09;投资有限公司、中国第一汽车股份有限公司、一汽-大众汽车有限公司[增资扩股将在取得适当监督&#xff08;包括反垄断&#xff09;审批后完成]、万帮数字…

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL&#xff08;Python Imaging Library&#xff09;模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能&#xff1a; import wx&#xff1a;导入 wx…

jdbc235

概念&#xff1a;java database connectivity java数据库连接 java语言操作数据库 定义了一套操作所有关系型数据库的规则&#xff08;接口&#xff09; 本质&#xff1a;其实是官方公司定义了一套操作所有关系型数据库的规则&#xff0c;即接口。各个数据库厂商去实现这套接…

百度“AI智障”到AI智能体验之旅

目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结&#xff1a;四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格&#xff0c;正巧之前也体验过它的前身&q…

医疗小程序:让服务更高效,用户体验更优化

随着移动互联网的快速发展&#xff0c;小程序已经成为了一个热门的开发方向。医疗健康类小程序也不例外&#xff0c;拥有广泛的市场需求和前景。本文将为你提供一份完整的医疗健康类小程序开发攻略&#xff0c;帮助你快速开发上线一个专业成熟的小程序商城。 一、选择合适的小程…

软件架构设计(二) 软件架构风格其他风格简介

架构师备战(四)-软件架构设计(二) 软件架构风格其他风格简介 架构风格其实是很重要的知识,我们先了解了基本的五种架构风格, 我们之前也提到除了这五种风格之外, 还有一些没有收录在这几种风格之内的, 这次会去做一个探索。 1、闭环控制架构风格(过程控制)【重要】 概念 …

isEmpty 和 isBlank 的区别

干了3年java&#xff0c;代码中 isEmpty 和 isBlank 的区别 都不知道&#xff0c;一顿瞎用。也许你两个都不知道&#xff0c;也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外&#xff0c;并不知道还有isAnyEmpty/isNoneEmpty/isAnyBlank/isNoneBlank的存在, come on ,让我们…

嵌入式学习笔记(7)ARM汇编指令4-多寄存器指令

多寄存器访问指令 ldr/str每周期只能访问4字节内存&#xff0c;如果需要批量读取、写入内存的话太慢&#xff0c;解决方案就是ldm/stm&#xff0c;ldm(load register multiple)&#xff0c;stm(store register multiple) 举例&#xff1a; stmia sp, {r0 - r12} 将r0存入sp指…

Message: ‘chromedriver‘ executable may have wrong permissions.

今天运行项目遇到如下代码 driverwebdriver.Chrome(chrome_driver, chrome_optionsoptions)上述代码运行报错如下&#xff1a; Message: chromedriver executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home出错的原…

JPA在不写sql的情况下实现模糊查询

本文已收录于专栏 《Java》 目录 背景介绍概念说明单字段模糊匹配&#xff1a;多字段模糊匹配&#xff1a; 实现过程代码实现1.写一个实体类去实现Specification接口&#xff0c;重写toPredicate方法2.定义一个接口去继承JpaRepository接口&#xff0c;并指定返回的类型和参数类…