【数据结构】非递归实现二叉树的先序遍历

三种非递归遍历二叉树的方法    就以这个树为例,来讲讲二叉树的非递归遍历。 先序遍历: 先序遍历结果为3 4 6 5 8 9,就拿树的左枝为例,3是根,打印,4是3的左孩子,打印,6是4的左孩子,打印,6的左孩子为空,所以返回到4,然后去找4的右孩子,4的右孩子也为空,返回到3,这就是左子树遍历的过程。然后非递归主要用到栈来存储结点,栈先进后出,所以应该是右孩子先入栈,左孩子后入栈,这样pop就能先得到左孩子。先将根结点3入栈,接下来就是开始循环,循环结束的条件就是栈为空,先弹出栈顶,再打印栈顶,如果. 阅读详情

1.算法思想

借助栈来实现二叉树的非递归先序遍历。访问某结点后,要将该结点的指针添加到栈中,以便能够通过该结点找到他的右子树,以如下一个简易的的二叉树作为示例:
在这里插入图片描述

当遍历的根结点为T,其基本思想为:

  1. 当T != NULL时,说明当前T所指的二叉树不空,因此将其添加到栈中,然后再遍历它的左子树。
  2. 当T == NULL时,说明该根结点为空,那么此时栈顶结点就是当前T的父结点,将栈顶结点出栈,就能根据栈顶结点访问其右子树,并将其入栈。

2.定义结构体

typedef struct BiNode {
    int data;
    struct BiNode *lchild, *rchild;
} BiNode, *BiTree;

3.函数实现

void PreOrder(BiTree T) {
    int top = -1;   //栈顶指针
    BiNode* S[MAXSIZE]; //栈
    //当栈为空且所指根结点为空,说明该二叉树遍历完成
    while (T != NULL || top != -1) {
        while (T != NULL) {//当T不为空,说明该根结点存在,则遍历
            S[++top] = T;
            printf("%d\t", T->data);
            T = T->lchild;
        }
        //此时T == NULL退出循环,说明当前栈顶结点的左子树为空,开始遍历其右子树
        if (top != -1) {
            T = S[top--];
            T = T->rchild;
        }
    }
}

4.运行结果

在这里插入图片描述

5 .完整代码

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

//定义结构体
typedef struct BiNode {
    char data;
    struct BiNode *lchild, *rchild;
} BiNode, *BiTree;

/*非递归先序遍历
1.设要遍历的根结点为T,此时T有两种情况:
 1.1 当T != NULL,说明当前根结点存在,那么就将其加入到栈中,然后遍历他的左子树
 1.2 当T ==
NULL,说明该根结点不存在,则此时的栈顶结点是T的父结点,那么将栈顶结点弹出
     并遍历该栈顶结点的右子树
*/
void PreOrder(BiTree T) {
    int top = -1;   //栈顶指针
    BiNode* S[MAXSIZE]; //栈
    //当栈为空且所指根结点为空,说明该二叉树遍历完成
    while (T != NULL || top != -1) {
        while (T != NULL) {//当T不为空,说明该根结点存在,则遍历
            S[++top] = T;
            printf("%d\t", T->data);
            T = T->lchild;
        }
        //此时T == NULL退出循环,说明当前栈顶结点的左子树为空,开始遍历其右子树
        if (top != -1) {
            T = S[top--];
            T = T->rchild;
        }
    }
}

int main(int argc, char const *argv[]) {
    BiTree l1 = (BiTree)malloc(sizeof(BiNode));
    BiNode *l2 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l3 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l4 = (BiNode *)malloc(sizeof(BiNode));
    l1->data = 1;
    l2->data = 2;
    l3->data = 3;
    l4->data = 4;
    l1->lchild = l2;
    l1->rchild = l3;
    l2->lchild = NULL;
    l2->rchild = l4;
    l3->lchild = NULL;
    l3->rchild = NULL;
    l4->lchild = NULL;
    l4->rchild = NULL;
    printf("先序遍历的结果为:\n");
    PreOrder(l1);
    return 0;
}

牛客网日刷30题错题解析--数据结构 今天的日刷30题,错误11题,对于小白来说略有进步,有些题目熟悉了做起来很快,继续坚持,从今天起再坚持从每天2题编程题刷起,提高自己的编程思维。错题1.关于无向连通图的最小生成树,正确的是()选项:A 克鲁卡斯尔算法和普里姆算法一定生成相同的树;B:都会生成唯一一棵树;C权值之和可能是不同的值;D:权值之和是唯一的。分析:该知识点在我的盲区。克鲁卡斯尔算法和普里姆算法都是生成最小生成树,但是生成的... 阅读详情

相关推荐

二叉树非递归遍历算法分析

本文介绍了二叉树非递归遍历算法的一种实现方式,以及这种遍历算法是怎么推导出来的。

weixin_43875867的博客 1325

数据结构_非递归遍历二叉树(C语言)

目录(一)图文解析(二) 代码解析(1) 二叉树的基本操作1.0 二叉树的存储结构1.2 先序递归创建二叉树1.3 先序非递归遍历二叉树1.4 中序非递归遍历二叉树1.5 后序非递归遍历二叉树1.6 层序非递归遍历二叉树(2) 二叉树源代码及测试2.1 源代码:2.2 测试结果: (一)图文解析 一般二叉树采用的是链式存储结构,也就是单链表的结构,但二叉树的结点包括俩个指针域,一个指向左结点,一个指右结点,即二叉; 1、树的度: 不管哪个结点,二叉树都只能最多分出两个分支,所以二叉树的度为2; 2、树

小黯 3070

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

二叉树的遍历(非递归)

遍历二叉树, 是指按一定的规则和顺序访问二叉树的所有结点, 使每一个结点都被访问一次, 而且只被访问一次.也可以是NRL, 因为这两种遍历方法都是先访问根结点, 所以没有区别, 掌握其中一种, 另一种也随之掌握.BFS: 是指沿着二叉树的宽度优先遍历二叉树的结点, 即从上到下从左到右逐层遍历二叉树的结点.由于二叉树是非线性结构, 因此, 二叉树的遍历实质上是将二叉树的各个结点排列成一个线性序列.层序遍历就是根据二叉树的结构从上到下从左到右逐层遍历二叉树的结点.给你一棵二叉树的根节点。

m0_61433144的博客 9117

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

河洛理数【陈抟】先天命卦大运

首先我们把前文提及的天干和地支进行上下划分,那么每一年的年份都是使用一天干和一地支进行组合,即如上的甲子、癸亥,那么下一年就是天干和地支都进行顺延一位进行组合,如甲子年下一年就是乙丑年,但是由于天干是十个、地支有十二个,所以要遍历一遍的话,就正好是 60 年。1924 年 ~ 1983 年(中元) 1984 年 ~ 2043 年(下元) 2044 年 ~ 2103 年(上元)2、找到卦中第一个(从下往上,也就是初爻、二到五爻、上爻)对应时辰的阴阳爻。5、也就是所属的元堂爻。

Daniel专栏 2071

数据结构5.4-二叉树非递归的中序先序遍历(利用栈实现)

#include <stdio.h> #include <stdlib.h> #include<bits/stdc++.h> using namespace std; typedef struct BiTNode{ //定义二叉树 int data; bool visitflag; //用于判断是否已经访问过该节点 struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //栈的定义 *

alkhgaoha的博客 181

如何在 DevOps 管道中实现 AI?

AI与DevOps的融合(AIOps)正在重塑软件开发生命周期。本文系统阐述了AI在DevOps中的五大应用场景:智能监控、自动化测试、安全防护、CI/CD优化和事件管理,并提出了六步实施框架:痛点识别、工具选型、流程集成、智能监控、MLOps和治理合规。通过Netflix、Google等企业的实践案例,验证了AI在提升部署效率(降低40%故障率)、缩短问题解决时间(MTTR减少60%)方面的显著价值,同时指出数据质量、模型偏差等实施挑战。研究表明,战略性地

介绍AWS Azure GCP devops Terraform 等技术 497

数据结构【完整代码】之(C语言实现【二叉树】创建、递归遍历(前序、中序、后序)、非递归先序遍历)

本文包含两个文件的代码和一张测试效果图: BinaryTree.h文件: 用于存储信息:存放函数、结构体、栈的函数实现、变量名等 TreeTravel.cpp文件: 用于测试 效果图:(位于最上方) 效果图: BinaryTree.h文件: #include<stdio.h> #include<stdlib.h> #define MAX_TRUE_SIZE 100 #define OK 1 #define ERROR 0 typedef int Status; typede

Zhou_LC的博客 1671

PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】

PyQt5数据库开发3 6.1 QSqlQuery实操案例【多图详解】,本文有点长,主要每一个步骤都有对应的图文教程!!!

qq_53317005的博客 2962

【数据分享】12.5米分辨率DEM地形数据(分省)

该数据来源于NASA地球科学数据网站(https://nasadaacs.eos.nasa.gov/),是ALOS卫星获取的高精度地形数据。该数据由于精度高,包括全省范围的数据和省内每个城市范围的数据!

JData_Engineer的博客 2171

# 遍历结构体_五分钟C语言数据结构 之 二叉树先序遍历

五分钟C语言实现常见数据结构今天的内容分享的是二叉树先序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuanlan.zhihu.com/p/130743652二叉树先序遍历二叉树的遍历方式主要由先序遍历、中序遍历和后续遍历,还后就是层次遍历关于二叉树的详细遍历方式,这里不详细赘述了,主要的还是代...

weixin_36342477的博客 100

Spring-AI 第 17 章 - 飞书机器人接入详解

✅ Stream 长连接(官方 SDK)✅ AI 对话(支持工具调用)✅ 消息接收与回复✅ 天气查询✅ 数据库查询✅ 数学计算✅ 事件去重Stream 长连接模式:使用官方 SDK 建立 WebSocket 长连接,服务器主动连接飞书,无需公网 IP消息处理流程:接收消息 → 解析内容 → AI 处理 → 回复用户AI 工具调用:接入 FunctionTools,支持天气、计算、日期、数据库查询等多种工具。

AppBlog.CN全栈架构 210

# 遍历结构体_五分钟C语言数据结构 之 二叉树先序遍历 非递归

五分钟C语言实现常见数据结构今天的内容分享的是二叉树先序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuanlan.zhihu.com/p/130743652二叉树先序遍历二叉树的遍历方式主要由先序遍历、中序遍历和后续遍历,还后就是层次遍历关于二叉树的详细遍历方式,这里不详细赘述了,主要的还是代...

weixin_39951929的博客 69

OpenClaw与大语言模型(Claude/GPT/MiniMax)的集成架构与最优配置策略

摘要 本文探讨了OpenClaw框架与大语言模型(Claude/GPT/MiniMax)的集成架构与优化策略。大语言模型具有强大的自然语言处理能力,但集成面临API成本、响应延迟、上下文管理等挑战。OpenClaw采用分层架构设计,包括用户界面层、对话管理层、提示工程层、模型适配层和API调用层,支持多模型切换、智能对话管理和成本控制。系统通过模型适配层实现不同API的统一调用,并提供缓存、监控等优化机制。该集成方案能够充分发挥大语言模型的优势,为本地AI助理提供更智能的服务。

一键难忘的博客 1693

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构实验7_C语言_二叉树的应用、递归实现先序、后序遍历、求树的深度,非递归使用自定义的栈的两种中序遍历、非递归使用自定义的队列的层序遍历

实验7-二叉树的应用 1)实验目的 通过该实验,使学生理解二叉树的链式存储,掌握二叉树的几种遍历算法,并通过该实验使学生理解递归的含义,掌握C语言编写递归函数的方法和注意事项. 2)实验内容 实现教材中算法6.4描述的二叉树创建算法,在此基础上实现二叉树的先序、后序递归遍历算法、两种非递归中序遍历、层序遍历、求二叉树的深度。注意:在非递归算法中用到栈和队列时,不要调用系统的栈和队列,需要自己实现栈和队列的操作。 3)验收/测试用例 创建 输入 :ABC$$DE$G$$F$$$ ($表示空格)

xiaosi的博客 2230

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

非递归方式实现二叉树遍历

先序遍历 void BinaryTree::PreOrder(BinTreeNode *current = root) { stack<BinTreeNode*> s; while (current||!s.empty()) { if (current) { cout << current->data << endl; s.pu...

HeiRen 331

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

非递归先序遍历二叉树总结(3种方法)

算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 递归先序遍历二叉树非常的简单,但是面试的时候面试官经常会要求我们写非递归的方法,这里总结一下。 方法1 先写一个最简单的方法。首先回想一下层次遍历二叉树的代码,利用一个队列完成树的遍历。如下代码。 public static void levelOrderTraverse(TreeNode root) { if (root == null) return; Li

qq_41512783的博客 8008

非递归遍历二叉树

 二叉树先序、中序遍历。 #include&lt;cstdio&gt; #include&lt;stack&gt; using namespace std; typedef struct btree{ char data; struct btree *ltree,*rtree; }tree,*Tree; //递归先序创建二叉树 void create(Tree &amp;t) { ...

Sea_Sand息禅 276

二叉树遍历的非递归算法

所谓二叉树的遍历,就是按照某种次序访问二叉树中每个节点,而且每个节点仅访问一次的过程。以L,N,R分别表示遍历左子树、访问根节点和遍历右子树,则可能有NLR、LNR、LRN、NRL、RNL、RLN等六种遍历方式。若限定先左后右,则只有前三种遍历,分别称为先序遍历、中序遍历、后序遍历,另外还有一种层序的遍历方式。 由于遍历的递归算法比较简单,这里只介绍遍历的非递归算法。这里给二叉链存储结构中节点类

wuruiaoxue的专栏 1281

非递归法实现二叉树的先序和中序遍历

学习了二叉树的非递归法的遍历,因二叉树非递归法的遍历比较难理解,放在下一篇博客进行详细的说明。 利用栈来实现二叉树的非递归先序和中序遍历 1、先序遍历 基本思想: 当前结点不为空时进入循环,打印当前结点。 该结点若有右孩子,让其右孩子入栈。 该结点若有左孩子,访问其左孩子,若没有左孩子则栈顶元素出栈。 重复上述步骤,直到栈空,栈顶没有元素而跳出循环。 void BinaryTreePr...

Willing_hope的博客 480

非递归实现二叉树先序、中序、后序和层序遍历

文章目录用非递归的方式实现二叉树的先序遍历用非递归的方式实现二叉树的中序遍历:用非递归的方式实现二叉树的后序遍历:用非递归的方式实现二叉树的层次遍历: 用递归方式实现二叉树先序、中序和后序遍历很简单。 用递归方法解决的问题都能用非递归的方法实现。递归就是利用函数栈来保存信息,如果用自己申请的数据结构来代替函数栈,也可以实现相同的功能。 用非递归的方式实现二叉树的先序遍历 1、申请一个栈stack,然后将头节点压入stack中。 2、从stack中弹出栈顶节点,打印,再将其右孩子节点(不为空的话)先压入s

将~军的博客 1539

先序非递归遍历二叉树(用栈来实现)

#include<stdio.h> #include<stdlib.h> #define MaxSize 50 typedef char ElemType; typedef struct BTNode { ElemType data; struct BTNode *left; struct BTNode *right; }BTNode,*BiTree; typedef struct Stack { BTNode *data[MaxSize]; int top; }S.

qq_61706112的博客 738

非递归实现先序遍历和中序遍历

先序建立二叉树、非递归实现先序遍历和中序遍历、队列实现层次遍历 先序建立二叉树,#表示空结点。 使用栈,实现非递归先序遍历和中序遍历。 使用队列实现层次遍历。 直接上代码,寒假完善注释,甚至从头到尾把《数据结构与算法》的相关代码写一遍。 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; typedef char DataType; #define MAXSIZE 1

ProgramNovice的博客 1193

二叉树递归非递归

#include<stdio.h> #include<stdlib.h> #define STACKINITSIZE 100 #define STACKINCREASESIZE 20 typedef char ElemType; //树结构 typedef struct tree { ElemType data; struct tree * lchild;...

weixin_45105837的博客 159

c语言描述的二叉树的基本操作(层序遍历,递归,非递归遍历)

#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 ...

anv65111的博客 470
上一篇: 【YOLOv5实战5】基于YOLOv5的交通标志识别系统-YOLOv5整合PyQt5
下一篇: 【数据结构】非递归实现二叉树的中序遍历
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值