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

article/2025/8/28 2:55:35

一.递归

递归很简单,只要在调用子节点前对当前节点进行操作即可

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, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};void dfs(TreeNode *root, vector<int> &arr){if(!root){return;}arr.emplace_back(root->val);dfs(root->left, arr);dfs(root->right, arr);
}

二.显示栈迭代

递归是把栈给隐藏起来,如果需要用迭代的方法,可以建立一个栈来实现遍历
思路是:
1.若有可进栈节点则进栈,否则出栈
2.栈顶元素的是否有左孩子节点有则进栈,循环直到没有
3.如果栈顶元素有右孩子节点,则赋值给insert,下次循环时进栈。
一直循环下去直到没有节点为止

vector<int> preorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode *> st;TreeNode *insert = root;while(insert || !st.empty()){if(insert){		// 有可进栈的节点st.push(insert);res.emplace_back(insert->val);	// 是前序遍历,进栈前记录数据(和递归一样)while(st.top()->left){	// 不断获取左孩子节点st.push(st.top()->left);res.emplace_back(st.top()->val);}// insert = nullptr;}else{st.pop();	// 没有可插入的节点就出栈(这样可以获取更上一层的节点)}if(!st.empty() && st.top()->right){insert = st.top()->right;	// 有右孩子节点,就赋值等下次循环插入st.pop();	// 这里必须出栈,否则会重复遍历}else{insert = nullptr;}}return res;
}

三.morris遍历

morris遍历的优点在于,只需用到常量级的空间消耗就可实现遍历
大致思路:
访问A的时候,要建立 A的左子树与A的联系,去B的最右右节点即E,设 E->right =A,
如此当访问完A的左子树时,可以返回到A节点。
同理 访问B时, 会建立 D->right = B (D没有右节点,所以时本身)
在这里插入图片描述

void printTree(TreeNode* root) {if (!root)return;TreeNode* pre;vector<int> res;while (root) {if (!root->left) {	// 没有左孩子节点,记录数据,调到右孩子节点res.emplace_back(root->val);	root = root->right;continue;}pre = root->left;while (pre->right && pre->right != root) {	// 获取左子树的最右子节点pre = pre->right;}if (!pre->right) {		// 不存在则时第一次遍历res.emplace_back(root->val);pre->right = root;root = root->left;}else {	// 存在则是第二次,需要返回上一个层次pre->right = nullptr;root = root->right;}}
}

备注:
morris遍历前序中序遍历非常思路一致,唯一的不同在于,记录数据的位置,如上段代码,改成如下就成了中序遍历:

		if (!pre->right) {		// 不存在则时第一次遍历//res.emplace_back(root->val); //前序便历在这里记录pre->right = root;root = root->left;}else {	// 存在则是第二次,需要返回上一个层次pre->right = nullptr;res.emplace_back(root->val);	//中序便历在这里记录root = root->right;}

想详细了解morris遍历的,可以看下我写的morris中序遍历


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

相关文章

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

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

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

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

二叉树前序遍历-迭代

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

二叉树前序遍历执行过程

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

二叉树的前序遍历

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

二叉树的先序遍历

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

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

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

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

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

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

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

分布式搜索引擎 ElasticSearch(ES)

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

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

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

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

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

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

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

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

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

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

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

es搜索引擎

ES的优势及使用场景、ES的功能及使用简介 简介&#xff1a; Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎&#xff0c;它可以近乎实时的存储、检索数 据。本身扩展性很好&#xff0c;可扩展到上百台服务器&#xff0c;处理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后…

ElasticSearch搜索引擎原理,都给你整理好了

“ 最近接触的几个项目都使用到了 Elasticsearch (以下简称 ES ) 来存储数据和对数据进行搜索分析&#xff0c;就对 ES 进行了一些学习。本文整理自我自己的一次技术分享。 本文不会关注 ES 里面的分布式技术、相关 API 的使用&#xff0c;而是专注分享下“ES 如何快速检索”这…

搜索引擎 Elasticsearch 的三大坑

搜索引擎的坑 ES 搜索引擎系列文章汇总&#xff1a; 一、别只会搜日志了&#xff0c;求你懂点原理吧 二、ES 终于可以搜到”悟空哥“了&#xff01; 三、1W字&#xff5c;40 图&#xff5c;硬核 ES 实战 本文主要内容如下&#xff1a; 搜索引擎现在是用得越来越多了&#…

Elasticsearch搜索引擎安装使用及Java中使用

Elasticsearch&#xff08;一&#xff09;Docker搭建ES集群 关闭防火墙 后面我们要使用多个端口&#xff0c;为了避免繁琐的开放端口操作&#xff0c;我们关掉防火墙 # 关闭防火墙 systemctl stop firewalld.service# 禁用防火墙 systemctl disable firewalld.service安装Do…