详解二叉树的中序遍历

  • 中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树(左->根->右)
中序遍历的递归算法

思路:

  1. 遍历左子树
  2. 访问根节点
  3. 遍历右子树

代码如下:

//二叉树的中序遍历(递归)
void BinaryTreePrevOrder(BTNode* root){if (root){BinaryTreePrevOrder(root->lChild);putchar(root->data);BinaryTreePrevOrder(root->rChild);}
}
中序遍历的非递归算法

思路:

借助栈来实现

  1. 传入二叉树根节点
  2. 从该节点开始遍历左子树,将所有节点入栈,直至左子树为空
  3. 取出栈顶并打印,再将栈顶出栈
  4. 如果有右孩子,从步骤2开始;没有右孩子从步骤3开始(直至全部出栈)

图解非递归算法
在这里插入图片描述

代码如下:

//二叉树的中序遍历(非递归)
void BinaryTreeInOrderNonR(BTNode * root)
{BTNode * cur = root;Stack st;StackInit(&st, 100);while (cur || !StackIsEmpty(&st)){for (; cur; cur = cur->lChild) //将当前节点及左孩子们入栈{StackPush(&st, cur);}cur = StackTop(&st);//1、如果右孩子为空,for循环不进,直接取栈顶//2、如果右孩子不为空,那么这是一个没有左孩子的节点//第一种情况是左子树访问完毕,第二种情况是左子树为空,无论哪种,当前节点都要打印putchar(cur->data);StackPop(&st);cur = cur->rChild; //当右子树为空时,检查栈是否为空,如果栈也空了,循环跳出}StackDestory(&st);
}

栈函数实现如下:

typedef char BTDataType;
// 二叉链的结构体
typedef struct BinaryTreeNode {BTDataType data;			// 当前节点值域struct BinTreeNode* lChild;	// 指向当前节点左孩子 struct BinTreeNode* rChild;// 指向当前节点右孩子 
}BTNode;typedef BTNode* StDataType;
// 栈的结构体
typedef struct Stack {StDataType* array;	// 指向动态开辟的数组size_t size;		// 有效数据个数size_t capicity;	// 容量空间的大小
}Stack;void StackInit(Stack* psl, size_t capicity)
{assert(psl);psl->capicity = capicity;psl->array = (StDataType *)malloc(capicity * sizeof(StDataType));assert(psl->array);psl->size = 0;
}void StackDestory(Stack* psl)
{assert(psl);if (psl->array){free(psl->array);psl->array = NULL;psl->size = 0;psl->capicity = 0;}
}void CheckCapacity(Stack* psl)
{assert(psl);if (psl->size == psl->capicity){psl->capicity *= 2;psl->array = (StDataType *)realloc(psl->array, psl->capicity * sizeof(StDataType));}
}void StackPush(Stack* psl, StDataType x)
{assert(psl);CheckCapacity(psl);psl->array[psl->size] = x;psl->size++;
}void StackPop(Stack* psl)
{assert(psl || psl->size);psl->size--;
}StDataType StackTop(Stack* psl)
{if (StackIsEmpty(psl)){return (StDataType)0;}return psl->array[psl->size - 1];
}int StackIsEmpty(Stack* psl)
{return psl->size == 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树的中序遍历算法

一,简介 二叉树的中序遍历在计算机行业有着重要的作用,其中一个应用就是判断一棵二叉树是否二叉排序树。 下面介绍递归和非递归两种方式实现中序遍历。 二,递归实现 递归实现非常简单,左根右依次进行即可。 void mid_scan2(n…

二叉树中序遍历的三种方法

二叉树是一种重要的数据结构,对二叉树的遍历也很重要。这里简单介绍三种二叉树中序遍历的方法。二叉树的中序遍历就是首先遍历左子树,然后访问当前节点,最后遍历右子树。对于下面的二叉树,中序遍历结果如下: 结果&…

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

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

二叉树的先序、中序、后序以及层次遍历

二叉树的先序、中序、后序以及层次遍历 方法:在遍历二叉树的时候,一个节点的遍历我们把它看做要经过它三次(下图红色区域)。 当经过一次,被写出来的点,我们称它为先序遍历。 当经过两次,被写出来的点,我…

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

二叉树后序遍历 二叉树后序遍历的实现思想是: 访问当前节点的左子树访问当前节点的右子树访问根节点 图 1 二叉树 以上图 1 为例,后序遍历的过程如下: 从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点&#…

二叉树的中序遍历

二叉树文章系列: 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历二叉树的前序、中序、后序、层序遍历【解法完整版】 本文目录 一、解题思路:递归二、解题思路:迭代 二叉树的中序遍历的记忆法则是“左根右"&#x…

MySQL基础- 多表查询 和 事务

目录 多表查询多表关系多表查询概述多表查询的分类内连接外连接自连接联合查询union,union all子查询标量子查询列子查询行子查询表子查询 综合练习小结 事务事务简介事务的操作四大特性ACID并发事务问题事务的隔离级别小结 多表查询 之前的SQL语句里的DQL只能进行…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值,传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间…

C++ 函数对象 详解

目录 🤔函数对象: 🤔本质: 🤔特点: 代码示例: 运行结果: 🤔 内置函数对象: 1.算数仿函数 代码示例: 运行结果: 2.关系仿函数 …

华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

一、题目描述 输入一个字符串,请按长度为8拆分每个输入字符串并进行输出,长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 二、输入描述 连续输入字符串(每个字符串长度小于等于100)。 三、输出描述 依次输出所有分割后的长度…

如何查看Steam的17位Id

方法/步骤 1、点击左上角Stream中的设置 2、 进入后点击“界面”,勾选“当可用时显示steam URL 地址栏”。 3、最后点击“查看个人资料”后17位即为ID。

steam注册模拟注册

代替手动模拟注册steam帐号

账号的注册

给账号注册,主要是给数据库中添加一个账号类数据,如图是以userName为用户名和password为密码的数据列表: 给用户和密码添加新的数据就是一个基础的账号注册,下面是页面的主要内容代码样式: 给相应的元素赋予name值&…

Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法

这个问题一直解决不了 后来我就用了V.P.eN翻墙在Google Chrome上粘贴进入网址再注册就巨快 我自己用的一个很简洁,好用免费的VPeN叫白鲸 V.P.eN下载网址:https://www.bjch110.com/?mid1003 下载安装都很简单 然后白鲸显示连接上后,就打开Goo…

怎样注册邮箱账号?

邮箱账号的注册可以按照以下2种途径: 一、Web端注册 1、网页端搜索:http://163.net,点击“立即注册” 2、4个邮箱套餐,可以根据自己的使用情况进行选择 3、填写申请的邮箱账号&输入密码,手机号码,完…

Unity账号注册

Unity账号注册 文章目录 Unity账号注册 先找到Unity官网 看图: ##基本信息填入 : 密码格式: 用户名错误提示 用户名已存在: 用户名无效(可能含有特殊字符或特殊字符串): ##验证信息 账号注册有两种验证方法:…

Steam注册到交易

Steam注册到交易 Steam注册到交易 Steam注册到交易Steam注册注册邮箱下载steam和网易UU加速注册Steam 手机令牌绑定 Steam注册 注册邮箱 163网易免费邮–中文邮箱第一品牌 申请一个你喜欢的邮箱名字和你的手机号就注册好你的邮箱啦。 下载steam和网易UU加速 大概是在这里…

IMX6ULL裸机篇之I2C相关寄存器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S,快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz(由之前的时钟实验章节可以知道是 66MHz)。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

使用docker和minio实现对象存储

文章目录 使用docker和minio实现对象存储什么是minio安装minio使用minio 使用docker和minio实现对象存储 什么是minio ​ Minio是一个开源的分布式文件存储系统,它基于 Golang 编写,虽然轻量,却拥有着不错的高性能,可以将图片、视频、音乐、…

k 折交叉验证

1. 原理步骤: 第一步,不重复抽样将原始数据随机分为 k 份。第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集&…