二叉树的构建及遍历

目录

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

题目

二叉树的构建及遍历

题目要求

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

示例

解答

方法一、

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

实现思路

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

时间复杂度和空间复杂度

代码

#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.rhkb.cn/news/116272.html

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

相关文章

华为云云服务器评测|基于华为云云耀云服务器L实例开展性能评测,例如 MySQL、Clickhouse、Elasticsearch等等

在当今云计算时代&#xff0c;越来越多的企业和个人开始选择将应用部署在云服务器上&#xff0c;以便更好地满足高性能、可靠性和可扩展性等需求。而华为云云耀云服务器L实例不仅提供了高性能和可靠性的计算和存储资源&#xff0c;而且具有灵活和高效的成本控制&#xff0c;深受…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

8. 损失函数与反向传播

8.1 损失函数 ① Loss损失函数一方面计算实际输出和目标之间的差距。 ② Loss损失函数另一方面为我们更新输出提供一定的依据。 8.2 L1loss损失函数 ① L1loss数学公式如下图所示&#xff0c;例子如下下图所示。 import torch from torch.nn import L1Loss inputs torch.tens…

mysql‘逻辑删除‘和‘唯一索引‘冲突的解决方案

一、冲突出现原因 在user表中将name字段设置唯一索引&#xff0c;添加逻辑删除字段del_flag&#xff08;1为删除&#xff0c;0为未删除&#xff09;之后&#xff0c;将name张四的字段删除&#xff0c;再添加一个name张四的记录则会出现冲突 二、解决 1.设置唯一索引组&#x…

【数学建模】清风数模正课7 多元线性回归模型

多元线性回归分析 回归分析就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;来解释Y的形成机制&#xff0c;从而达到通过X去预测Y的目的。 所以回归分析需要完成三个使命&#xff0c;首先是识别重要变量&#xff0c;其次是判断正负相关&#xff0c;最后是估计…

opencv-人脸识别

对https://blog.csdn.net/weixin_46291251/article/details/117996591这哥们代码的一些修改 import cv2 import numpy as np import os import shutil import threading import tkinter as tk from PIL import Image, ImageTkchoice 0# 首先读取config文件&#xff0c;第一行…

反射、Class

Class 获取实例化的三种方式

深入理解协同过滤算法及其实现

导语 个性化推荐系统在现代数字时代扮演着重要的角色&#xff0c;协助用户发现他们可能感兴趣的信息、产品或媒体内容。协同过滤是个性化推荐系统中最流行和有效的算法之一。 目录 协同过滤算法的原理 基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&am…

在firefox浏览器下破解hackbar

目录 一、介绍&#xff1a; 二、安装教程 1、打开firefox浏览器插件管理扩展 2、在firefox浏览器下安装老版本Hackbar &#xff08;1&#xff09;首先删除之前安装的Hackbar插件&#xff1a; &#xff08;2&#xff09;采用从文件安装附件添加组&#xff1a; &#xff08;3…

大数据课程K16——Spark的梯度下降法

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Spark的梯度下降法&#xff1b; ⚪ 了解Spark的梯度下降法家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09;&#xff1b; ⚪ 掌握Spark的MLlib实现…

xx音乐app逆向分析

目标 看一下评论的请求 抓包 这里使用httpcanary 请求包如下 POST /index.php?rcommentsv2/getCommentWithLike&codeca53b96fe5a1d9c22d71c8f522ef7c4f&childrenidcollection_3_1069003079_330_0&kugouid1959585341&ver10&clienttoken7123ecc548ec46d…

五子棋游戏禁手算法的改进

五子棋游戏禁手算法的改进 五子棋最新的禁手规则&#xff1a; 1&#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”&#xff08;包括“四三三”&#xff09;、“四四”&#xff08;包括“四四三”&#xff09;和“长连”。黑棋只能以“四三”取胜。 2&#xff0e;黑方…

Postman API测试之道:不止于点击,更在于策略

引言&#xff1a;API测试的重要性 在当今的软件开发中&#xff0c;API已经成为了一个不可或缺的部分。它们是软件组件之间交互的桥梁&#xff0c;确保数据的流动和功能的实现。因此&#xff0c;对API的测试显得尤为重要&#xff0c;它不仅关乎功能的正确性&#xff0c;还涉及到…

Idea安装免注册版ChatGPT

文章目录 一、前期准备二、开始使用 一、前期准备 1.准备Idea开发软件并打开&#xff08;VS Code同理&#xff09;! 2.【CtrlAltS】快捷键调出Settings窗口&#xff0c;如图 3.找到NexChatGPT 此插件不需要注册&#xff0c;可以直接使用&#xff08;高级一些的需要会员收费限…

Unity编辑器扩展 | 编辑器扩展基础入门

前言 Unity编辑器扩展 | 编辑器扩展基础一、基本概念二、核心知识点 简述三、相关API 总结 前言 当谈到游戏开发工具&#xff0c;Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境&#xff0c;使他们能够创建令人惊叹的游戏和交互式体验。然而&#xf…

视频集中存储/云存储/磁盘阵列/视频监控管理平台EasyCVR接入海康SDK后视频播放崩溃的问题排查

视频集中存储/云存储/磁盘阵列/视频监控管理平台EasyCVR可支持海量视频的轻量化接入与汇聚管理。在视频能力上&#xff0c;EasyCVR可实现视频直播、云端录像、检索与回放、云存储、告警上报、语音对讲、电子地图、H.265视频自动转码、服务器集群、AI智能分析接入以及平台级联等…

git文件夹内容详解

.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹&#xff0c;包含了Git仓库的所有相关信息。如下是.git文件夹中常见的一些内容及其作用&#xff1a; HEAD&#xff1a;指向当前所在的分支&#xff08;或者是一个特定的提交&#xff09;。 branches&#xff1a;存储…

yolov8机器视觉-工业质检

使用训练好的模型进行预测 yolo predict taskdetect model训练好的模型路径 source测试图片文件夹路径 showTrue效果展示 切换模型进行训练&#xff08;yolov8s&#xff09; 修改main.py训练参数文件 使用云gpu进行训练&#xff0c;很方便&#xff1a;点击链接转至在线云gpu…

SpringMVC-学习笔记

文章目录 1.概述1.1 SpringMVC快速入门 2. 请求2.1 加载控制2.2 请求的映射路径2.3 get和post请求发送2.4 五种请求参数种类2.5 传递JSON数据2.6 日期类型参数传递 3.响应3.1 响应格式 4.REST风格4.1 介绍4.2 RESTful快速入门4.3 简化操作 1.概述 SpringMVC是一个基于Java的Web…

Javase | IO流

目录&#xff1a; 1.输入 (Intput/Read)2.输出 (Output/Write)3.IO4.IO流5.IO流的分类&#xff1a;5.1 分类总述5.2 按照 “流的方向” 进行分类5.3 按照 “读取数据的方式” 进行分类 6.IO包下要重点掌握的流&#xff1a;6.1 文件专属 (流)6.2 转换流 ( 将字节流转换为字符流 …