二叉树的前序遍历(C语言)

article/2025/8/28 2:49:43

我们从两个方向讲解二叉树的前序遍历(递归+迭代)

一.递归

思想:

从根节点开始向其左孩子遍历每经过一个节点记录一下该节点的数值(只在第一次经过该节点时进行记录),当走到NULL时返回上一个节点,然后遍历其右孩子,如果右孩子存在记录其数值,再重复上面操作,如果不存在为NULL直接返回上一个节点再重复上面的操作.

代码如下:

void BTreePrevOrder(struct TreeNode* root,int* a,int* returnSize){//前序遍历if(NULL==root){//判出条件return;}a[(*returnSize)++]=root->val;BTreePrevOrder(root->left,a,returnSize);BTreePrevOrder(root->right,a,returnSize);
}

具体运行过程:(如图)

二.迭代

思想:

首先我们要知道递归的过程就是一个入栈和出栈的过程,所以我们可以使用迭代来模仿这个入栈和出栈的过程从而实现二叉树的前序遍历,首先判断该二叉树是否为空是空直接返回,不是空则进行前序遍历,将根节点入栈,一直将栈首元素的数值记录然后再将其左孩子入栈,当某个时刻栈首元素为空时,进入循环先将该空的节点出栈,然后记录新的栈首元素后将其出栈,此时的栈首元素为其上一层元素,方便其返回上一层,然后将记录的节点的右孩子入栈,为空继续循环,不为空退出循环重复上述操作.(具体过程看下图)

代码如下:

​
typedef struct TreeNode BTNode;typedef struct Stack{//构建栈的结构体BTNode* root_a[100];//存二叉树的节点的数组int size;//表示存储个数
}Stack;void PushStack(Stack* b,BTNode* root){//入栈b->root_a[b->size++]=root;
}void PopStack(Stack* b){//出栈b->size--;
}int* preorderTraversal(struct TreeNode* root, int* returnSize){int* a=(int*)malloc(sizeof(int)*100);//创建数组用来存储二叉树前序遍历的值if(NULL==a){printf("申请节点失败!\n");return NULL;}Stack b;//创建栈BTNode* pop_temp;//用来记录将要出栈的节点b.size=0;int i=0;PushStack(&b,root);//先把根节点入栈while(NULL != b.root_a[b.size-1]){a[i++]=b.root_a[b.size-1]->val;//第一次访问该节点时记录其值PushStack(&b,b.root_a[b.size-1]->left);//将该节点的左孩子入栈如果为NULL进入下一个
//循环while(NULL == b.root_a[b.size-1]){PopStack(&b);//先把这个为NULL的节点出栈if(0==b.size){//如果栈为空则遍历结束退出循环(*returnSize)=i;return a;                }pop_temp=b.root_a[b.size-1];//记录上一个节点PopStack(&b);//将其出栈,使其返回时可以直接进入上一层的节点PushStack(&b,pop_temp->right);//将该节点的右孩子入栈}}(*returnSize)=i;return a;
}​

具体运行过程:(如图)

 


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

相关文章

二叉树前序遍历--递归

前序遍历的概念:遍历顺序-根左右,从根节点往下查找,先找左子树、直至左子树为空(左子节点逐个入栈、直至左子节点为空),再找右子树(出栈找右子节点)第一次经过节点即打印,直到打印null,往回溯,打…

二叉树前序遍历(递归以及非递归)

二叉树前序遍历 对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢? 请看大屏幕 。。。。 上图是一棵二叉树,前序遍历结果:1 2 4 5 3 6 咦,我想你可能会疑惑什么叫做前序遍历…

二叉树前序遍历三种方式(c++ 实现)

一.递归 递归很简单,只要在调用子节点前对当前节点进行操作即可 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, …

数据结构二叉树前序遍历递归和非递归算法

2022.11.19 二叉树前序遍历递归和非递归算法 任务描述相关知识编程要求测试说明C/C代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的先(前)序遍历结果。 相关知识 为了完成本关任务,你需…

二叉树前序遍历(递归法和迭代法(即非递归法))——C++

声明:本文原题主要来自力扣力扣,记录此博客主要是为自己学习总结,不做任何商业等活动 本文主要讲解二叉树的前序遍历递归法和迭代法。中序遍历和后序遍历可以参考博主下面两篇博客:二叉树中序遍历(递归法和迭代法(非递…

二叉树前序遍历-迭代

二叉树的前序遍历 对于一颗二叉树,当遍历它的时候使用 递归总是轻而易举的。这是二叉树前序遍历-使用递归 public void preorderTraversal(TreeNode root){if(rootnull)return;System.out.print(root.data" ");preorderTraversal(root.left);preorderT…

二叉树前序遍历执行过程

二叉树前序遍历执行过程 前序遍历:根-左-右 图示 记录与总结,2021年 11月 12日 星期五 11:35:14 CST。

二叉树的前序遍历

二叉树文章系列: 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历二叉树的前序、中序、后序、层序遍历【解法完整版】 本文目录 一、解题思路:递归二、解题思路:迭代(方法1)三、解题思路&#xff…

二叉树的先序遍历

二叉树的概念 二叉树是一种特殊的树。二叉树的特点是每个节点最多有两个儿子,左边的叫左二子,右边的叫做右儿子,或者说每个结点最多有两棵子树,二叉树要么为空,要么由根节点、左子树和右子树组成,而左子树…

(数据结构)二叉树先序遍历

二叉树先序遍历 二叉树先序遍历的实现思想是: 访问根节点访问当前节点的左子树若当前节点无左子树,则访问当前节点的右子树 图 1 二叉树 以上图 1 为例,先序遍历的过程如下: 访问该二叉树的根节点,找到 1访问节点 1 …

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch?2. 安装并运行Elasticsearch2.1 拉取镜像2.2 启动镜像 3. 安装kibana3.1 拉取kibana镜像3.2 启动kibana镜像 4. Elasticsearch基本概念索引(Index)文档(Do…

【Elasticsearch】 es 搜索 返回信息 字段 解释

本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载。 文章目录 1.概述 1.概述 官网:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-body.html#request-body-search…

分布式搜索引擎 ElasticSearch(ES)

一、初识elasticsearch 1.了解ES 1)elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容。elasticsearch结合kibana、Logstash、Beats,也就是elast…

Elasticsearch搜索引擎该怎么使用,这篇文章彻底讲透(荣耀典藏版)

目录 前言 一、先说说 Lucene 二、ES 核心概念 2.1、集群(Cluster) 2.1.1、发现机制 2.1.2、节点的角色 2.1.3、脑裂现象 2.2、分片(Shards) 2.3、副本(Replicas) 2.4、映射(Mapping&…

ElasticSearch搜索引擎常见面试题总结

一、ElasticSearch基础: 1、什么是Elasticsearch: Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。 全文检索是指对每一个词建立一个索引&a…

elasticsearch搜索分数自定义以及相关度计算相关

elasticsearch搜索分数自定义以及相关度计算相关 es通过其score字段对搜索结果进行排序 在进行业务开发时通常其默认的分数计算是不符合预期的。 最简单的方法是通过boost字段来对每一个字段进行权重设置,来体现该字段的重要性。 boost字段会导致分数的计算公式发…

【ES】ElasticSearch搜索的底层原理?倒排索引和TF-IDF打分算法

目录 Elasticsearch搜索的底层原理倒排索引及其结构TF-IDF打分算法参考 Elasticsearch搜索的底层原理 ES搜索是分词后,每个字可以利用FST高速找到倒排索引的位置,并迅速获取文档id列表,大大的提升了性能,减少磁盘IO。 ES的搜索原…

详细描述一下Elasticsearch搜索的过程

详细描述一下Elasticsearch搜索的过程 我们都知道es是一个分布式的存储和检索系统,在存储的时候默认是根据每条记录的_id字段做路由分发的,这意味着es服务端是准确知道每个document分布在那个shard上的。 相对比于CURD上操作,search一个比较…

es搜索引擎

ES的优势及使用场景、ES的功能及使用简介 简介: Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数 据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。ES使用Java开发并…

ElasticSearch搜索引擎结合Mysql数据库,查询mysql数据

需要下载的东西 ElasticSearch——https://www.elastic.co/cn/downloads/elasticsearchLogstash(版本需要和ES对应)——https://www.elastic.co/cn/downloads/logstashmysql驱动jar包——https://dev.mysql.com/downloads/connector/j/ ElasticSearch 下载完ElasticSearch后…