二叉树的中序遍历算法

article/2025/10/8 17:50:40

一,简介

二叉树的中序遍历在计算机行业有着重要的作用,其中一个应用就是判断一棵二叉树是否二叉排序树。

下面介绍递归和非递归两种方式实现中序遍历。

二,递归实现

递归实现非常简单,左根右依次进行即可。

void mid_scan2(node* now)
{if(now->left != NULL)mid_scan2(now->left);cout<<now->num<<",";if(now->right != NULL)mid_scan2(now->right);
}

三,非递归实现

约定:

如果当前二叉树的某个结点没有左(右)孩子,那么该结点的左(右)孩子为NULL。

指针指向的结点,被称为当前结点。

1,实现思路

(1)如果根节点为空,则退出函数,否则将当前指针指向根节点,并进行以下的步骤:

(2)如果当前结点非空,将当前元素压栈,指针向左孩子。循环该步骤直至指针指空。

(3)如果当前指针指空,则:

                a,退栈,将指针指向退栈出来的元素,输出这个元素的数据。

                b,判断当前结点的右子树是否为空。

                       b(1) 如果非空,则指针指向当前结点的右孩子,跳转到步骤(2)

                        b(2)如果为空,退栈,将指针指向退栈出来的元素,输出这个元素的数据。

                                   b(2-2)让指针指向当前结点右子树根结点。

(4)重复执行以上操作。

2,具体代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef struct node0{ int num;node0* left;node0* right;
}node;void layer_scan(node* head,int n)//层次遍历 ,用来验证二叉排序树的生成是否成功 
{cout<<"层次遍历的结果:"<<endl; node* queue = (node*)malloc(sizeof(node)*(n+1));//层次遍历所需队列 int size = n+1;int i;int front=0,rear=0;//队空时,front和rear相等;队满时rear的下一个就是front//node* now = (node*)malloc(sizeof(node));queue[rear++] = *head;while(front != rear) {if(queue[front].left != NULL){queue[rear] = *(queue[front].left);rear = (rear + 1)%size;}if(queue[front].right != NULL){queue[rear] = *(queue[front].right);rear = (rear + 1)%size;}cout<<queue[front].num<<",";front = (front + 1)%size;}cout<<endl;
}int* mid_scan(node* head,int n)//中序非递归遍历,并将遍历顺序存储在数组中然后返回 
{cout<<"中序非递归遍历的结果是:"<<endl; if(head == NULL){cout<<"该树为空!"<<endl;return NULL; }int* result = (int*)malloc(sizeof(int)*(n+1));//存储结果的栈 node* stack = (node*)malloc(sizeof(node)*(n+1));//实现非递归遍历的栈 int top=0;//stack的栈顶指针 int top2=0;//result的栈顶指针 node* now;//当前指针 now = head;//初始化当前指针 while(top>=0){while(now != NULL)//当前指针非空,那么就入栈,向左子树前进 {stack[top++] = *now;now = now->left;}top--;if(top<0)return result;now = &stack[top] ;//出栈,并让当前指针指向出栈的元素 cout<<now->num<<",";result[top2++] = now->num;if(now->right != NULL)//右子树非空就往右前进一步,然后continue {now = now->right;continue;}else{top--;if(top<0)return result;now = &stack[top] ;cout<<now->num<<",";result[top2++] = now->num;now = now->right;}}return result;
}
void mid_scan2(node* now)//中序递归遍历算法 
{if(now->left != NULL)mid_scan2(now->left);cout<<now->num<<",";if(now->right != NULL)mid_scan2(now->right);
}
node* BST_tree(int n)//建立一颗二叉排序树,该二叉树的结点个数为n,结点的值是随机的.
{//中序遍历二叉排序树的结果序列是一个有序序列,该函数最后返回该二叉排序树的根结点指针 node* head;//根结点指针 node* now; int i,num;srand(time(0));//随机改变下面的随机种子 for(i=0;i<n;i++){num = rand() % (n*n);node* p = (node*)malloc(sizeof(node));p->num = num;//cout<<num<<",";if(i==0) {head = p;head->left = NULL;head->right = NULL;}now = head;while(now->left!=NULL || now->right!=NULL)//未到达叶子结点时 {if(p->num > now->num){if(now->right == NULL)break;now = now->right;}else {if(now->left == NULL)break;now = now->left;}}if(p->num > now->num)//该if-else语句用来实现新结点在当前叶子结点的插入 now->right = p;else now->left  = p;p->left = NULL;p->right = NULL;}cout<<endl;return head;//返回根结点指针 
}void question_285_06()//验证答案 
{int n,i;node* head;int* mid_serial;//接收中序非递归遍历序列 n=10;head = BST_tree(n);//生成二叉排序树 cout<<"层次遍历,验证二叉排序树,"; layer_scan( head, n);//层次遍历,验证二叉排序树的生成是 cout<<"中序递归遍历的结果是:"<<endl;mid_scan2(head);//中序递归遍历 cout<<endl;mid_serial = mid_scan( head, n);//中序非递归遍历序列 cout<<endl;cout<<"mid_serial数组中的内容是:"<<endl;for(i=0;i<n;i++)cout<< *(mid_serial+i)<<",";cout<<endl;
}
int main()
{question_285_06();return 0;
}

运行结果:

如有错误,敬请指正,礼貌交流,感激不尽 


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

相关文章

JavaScript算法 — 二叉树遍历

目录 1、构造二叉树2、递归遍历3、非递归遍历3.1 先序3.2 中序3.3 后序 1、构造二叉树 树节点&#xff1a; // 二叉树节点的构造函数 function TreeNode(val, left, right) {this.val (valundefined ? 0 : val)this.left (leftundefined ? null : left)this.right (righ…

二叉树遍历算法之一:前序遍历

递归实现前序遍历 二叉树的前序遍历是指从根节点出发&#xff0c;按照先根节点&#xff0c;再左子树&#xff0c;后右子树的方法遍历二叉树中的所有节点&#xff0c;使得每个节点都被访问一次。 当调用遍历算法的时候前序遍历的具体过程如下&#xff1a; 首先访问根节点&…

二叉树遍历小结

前言 二叉树是相当重要的数据结构&#xff0c;目前我还只会玩玩它的遍历&#xff08;年轻不懂事没好好学&#xff0c;不然早就达到人生巅峰了&#xff09;&#xff0c;LeetCode上二叉树的简单题&#xff0c;大部分通过遍历加一点小逻辑即可解决&#xff0c;所以总结一下几种遍…

二叉树遍历之层次遍历算法入门详解

一、引言 二叉树的遍历常见的方法有先序遍历、中序遍历、后序遍历和层次遍历等&#xff0c;本文给出了C语言版本的层次遍历二叉树的算法。 层次遍历的原理很简单&#xff0c;总结为一句话就是“从上到下&#xff0c;从左到右”&#xff0c;就是从树根开始逐层访问二叉树的结点&…

二叉树的四种遍历算法

二叉树作为一种重要的数据结构&#xff0c;它的很多算法的思想在很多地方都用到了&#xff0c;比如STL算法模板&#xff0c;里面的优先队列、集合等等都用到了二叉树里面的思想&#xff0c;先从二叉树的遍历开始&#xff1a; 看二叉树长什么样子&#xff1a; 我们可以看到这颗…

实现二叉树各种遍历算法

目录 前言一、题目1.二叉树的各种遍历过程及遍历算法设计。2.实现二叉树各种遍历算法 总结 前言 提示&#xff1a;记得关注我哦&#xff01;&#xff01;&#xff01; 一、题目 1.二叉树的各种遍历过程及遍历算法设计。 &#xff08;1&#xff09; 先序遍历二叉树&#xff1…

算法分析之二叉树遍历

算法相关数据结构总结&#xff1a; 序号数据结构文章1动态规划动态规划之背包问题——01背包 动态规划之背包问题——完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 算法&#xff08;Java&#xff09;——动态规划2数组算法分析之数…

二叉树遍历算法总结

A. 二叉树的遍历 1.前序遍历二叉树&#xff1a; (1)若二叉树为空&#xff0c;则为空操作&#xff0c;返回空。 (2)访问根结点。 (3)前序遍历左子树。 (4)前序遍历右子树。 a.二叉树前序遍历的递归算法&#xff1a; void PreOrderTraverse(BiTree BT)…

二叉树的遍历算法

遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有节点&#xff0c;使每一个节点都被访问一次&#xff0c;而且只被访问一次。由于二叉树是非线性结构&#xff0c;因此&#xff0c;树的遍历实质上是将二叉树的各个节…

【算法】二叉树遍历算法总结:前序中序后序遍历

前言 二叉树遍历是非常经典的算法题&#xff0c;也是二叉树的一道基础算法题。 但是在平常的笔试面试中&#xff0c;其出现的频率其实并不是特别的高&#xff0c;我推测是这种题目相对来说比较基础&#xff0c;算是一个基础知识点。 比如剑指offer中出现的后序遍历题目&…

二叉树遍历算法的应用

目录 一、二叉树遍历算法的应用——二叉树的创建 二、二叉树遍历算法的应用——复制二叉树 三、二叉树遍历算法的应用——计算二叉树的深度 四、二叉树遍历算法的应用——计算二叉树节点总数 五、二叉树遍历算法的应用——计算二叉树叶子节点数 一、二叉树遍历算法的应用—…

一文弄懂二叉树的三种遍历方式

关注公众号【高性能架构探索】&#xff0c;后台回复【pdf】&#xff0c;免费获取计算机必备经典书籍 俗话说&#xff1a;学如逆水行舟,不进则退;心似平原走马,易放难收。这句话对程序员而言&#xff0c;体会更深。这行已经越来越卷了&#xff0c;时刻准备着&#xff0c;&#x…

二叉树遍历算法

目录 先序遍历 中序遍历 后序遍历 层序遍历 938. 二叉搜索树的范围和 110. 平衡二叉树 114. 二叉树展开为链表 117. 填充每个节点的下一个右侧节点指针 II 116. 填充每个节点的下一个右侧节点指针 1&#xff0c;三种遍历都是先把二叉树的最左结点循环入栈(DFS迭代)&am…

二叉树的四种遍历算法(结构体数组)

一、二叉树的定义 以字符串的形式定义一棵二叉树的先序序列&#xff0c;若字符是‘#’&#xff0c;表示该二叉树是空树&#xff0c;否则该字符是相应结点的数据元素。 例&#xff1a;ABDG##HI####CE#J##F## 对应的二叉树&#xff1a; 思路讲解&#xff1a; 想要遍历二叉树&am…

二叉树的四种遍历方式

概要 树本身是一种简单化的图 &#xff1b; DFS对应前中后序遍历&#xff0c;BFS对应层序遍历 二叉树结构 struct treenode {int val;treenode *left;treenode *right;treenode() : val(0), left(nullptr), right(nullptr) {}treenode(int x) : val(x), left(nullptr), right(n…

针对Linux学习,值得阅读的五本书籍,不看可能错失机会

今天为了总结一些可以帮助各位在学习过程中提供帮助的一些书籍。 一.鸟叔的私房菜&#xff1a; 本书是知名度颇高的Linux入门书《鸟哥的Linux私房菜基础学习篇》的新版,而详细地介绍了Linux操作系统。全书分为五部分;第一部分部分着重说明计算机的基础知识、Linux的学习方法&a…

从零开始学习Linux(一)关闭虚拟机系统

关闭系统&#xff0c;需要输入如下命令 poweroff然而&#xff0c;你只能得到如下反馈 -bash: poweroff:command not found此项错误是因为poweroff命令是一个系统管理命令。执行此项命令需要高级使用者特权。 因此&#xff0c;为了关闭系统&#xff0c;我们首先需要切换到root…

个人随笔/小白应该如何学习Linux,我的一些心得分享.

大家好&#xff0c;今天给大家分享一下0基础的人如何入门Linux&#xff0c;此文来源&#xff1a;我在上班的路上看到一篇文章&#xff0c;也是写的0基础的人如何学习Linux的文章。当时我在想&#xff0c;我写博文一年多&#xff0c;都是相关Linux及Python等技术的文章&#xff…

Linux学习路线

&#xfeff;&#xfeff; 关于 Linux Linux 因其开源&#xff0c;免费&#xff0c;可裁剪&#xff0c;被应用到很多领域&#xff0c;尤其是嵌入式设备上。 Android 系统内核也是基于 Linux 的。 另外还有各种服务器和工作站也是用的 Linux。 什么是嵌入式设备&#xff1f;…

为什么要学习 Linux ????

目前企业中大量的使用Linux作为服务器&#xff0c;在以后你们就业后&#xff0c;会发现web服务器Tomcat ,jobss这一类都是搭建在linux上面的&#xff0c;后面我们需要学习的数据库mysql &#xff0c; oracle &#xff0c;db2&#xff0c; 或者greenplum这一类的&#xff0c;在企…