【算法题】二叉树的前序遍历(递归和非递归算法分析)

C语言实现二叉树的前序、中序、后续遍历(递归法) C语言实现二叉树的前序、中序、后续遍历(递归法),大家可以看看哈。。。 立即下载
          问题:对二叉树的前序遍历(递归和非递归算法)

递归算法:输出根节点的值
         对左子树进行左遍历
         对右子树进行遍历

  代码如下:
void PreorderTraversal(node *root)
{
  if(root)
   printf("%d\n",root->value);
else
return ;
PreorderTraversal(root->left);
PreorderTraversal(root->right);
}

这个算法的执行时间是多少呢?因为每个节点被检查了一次,所以它是O(n)级的。

        非递归算法:要完成该算法,需要深入分析一下递归算法的本质,再用循环算法来模拟它的动作。递归算法使用了堆栈这种数据结构,利用堆栈来完成数据处理。
堆栈的四个函数:

int Push(element **stack,void *data);
int Pop(element **stact,void **data);
int CreateStack(element **stack);
int deleteStack(element **stack);


首先来探究下递归算法的本质:
递归算法:a.输出根节点的值
          b.对左子树进行左遍历
          c.对右子树进行遍历


           第一次进入递归函数的时候,先输出根节点的值,然后递归地调用这个函数对左子树进行遍历。在发出这个递归调用的时候,调用者的程序状态就会被压入堆栈保存起来,这样在递归调用返回时,调用者就能从自己离开的地方开始继续执行。
         对左遍历算法来说,调用者将继续对右子树进行左遍历。为了能在遍历完左子树之后开始对右子树的遍历,递归调用隐含地把右子树的地址保存在堆栈上。在输出一个节点之后但在前进到它的左节点之前,该节点的右节点将被压入一个你不知道的堆栈里保存起来。当没有子节点可供处理时,就会从递归调用中返回一层,从堆栈上弹出一个右节点,然后以它为起点继续进行左遍历。
         总结:这个算法先输出当前节点的值,然后再把它的右节点压入堆栈,然后前进到它的左节点;当没有子节点可供处理时,算法将从堆栈上弹出一个新的当前节点。这个过程将一直重复到遍历完所有的节点为止,堆栈里也不再有任何数据。
 
 注:必须保证左节点总是先于右节点被弹出来,所以得先压入右节点,再压入左节点。


  非递归算法如下:
    创建堆栈
     把根节点压入堆栈
    当堆栈不为空,循环
     弹出一个节点
     如果这个节点不是NULL
       输出它的值
       把这个节点的右节点压入堆栈
       把这个节点的左节点压入堆栈


 代码如下:
 
 void PreorderTraversal(node *root)
{
element *theStack;
void *data;
node *curNode;
CreateStack(&theStack);
Push(&theStack,root);
while(Pop(&theStack,&data))
{
curNode=(node *)data;
if(curNode)
{
printf("%d\n",curNode->value);
Push(&theStack,curNode->right);
Push(&theStack,curNode->left);
}
}
DeleteStack(&theStack);
}

这个算法的时间开销也是O(n)
二叉树先序遍历的递归与非递归算法 用户以先序遍历的方式键入二叉树各结点的数据域值(字符型),程序建立二叉树,然后分别用递归和非递归算法对二叉树进行遍历。每访问一个结点即打印该结点的数据域值。 立即下载

相关推荐

手把手教你玩转AT32F403A位带操作:像51单片机一样控制GPIO

本文详细介绍了如何在雅特力AT32F403A国产MCU上实现位带操作,像51单片机一样高效控制GPIO。通过实战演示和性能对比,展示了位带操作在实时控制中的优势,包括更快的执行速度和更低的延迟,特别适合工业控制和电机驱动等场景。

weixin_29234509的博客 285

二叉树的遍历(递归算法与非递归算法)

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:以下是本篇文章正文内容 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warn..

风间琉璃的博客 2745

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1904

设计一个算法,输出从每个叶子节点到根节点的逆路径

下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储。 方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置。当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径。对应的算法如下: void AllPath(BTNode * b) { struct snode { BTNode *no

wuruiaoxue的专栏 1万+

Fusion 360嵌入式外壳建模实战:从草图到可装配结构

参数化三维建模是现代电子结构设计的核心能力,其本质是通过几何约束与特征驱动实现设计意图的精确表达和快速迭代。Fusion 360作为集成CAD/CAM/CAE的云端平台,以时间轴驱动的参数化工作流、基于基准面的草图约束机制和面向制造的特征操作逻辑,显著提升了嵌入式硬件的结构验证效率。该技术价值在于支持工程师在无专业机械背景前提下,独立完成PCB适配、散热布局、接口开孔与装配干涉检查等关键任务,广泛应用于3D打印原型、CNC加工外壳及IoT终端结构开发。本文以ESP32冰箱监控终端为实例,详解从基准定义、草图

weixin_35671843的博客 588

CAD文件转换避坑指南:Inventor导出STP时这些设置千万别忽略

本文深入解析了使用Autodesk Inventor导出STP文件时的关键设置与避坑指南。重点探讨了应用协议选择、样条曲线拟合精度对几何保真度的影响,以及装配体结构和元数据的保全策略,旨在帮助用户实现高质量、零误差的CAD数据交付,避免下游软件打开时出现特征丢失或曲面破碎等问题。

weixin_29214559的博客 517

获取根节点的两种方式

1.ServletActionContext.getServletContext().getRealPath("/") -- Strust2的方法 2.this.getClass().getClassLoader().getResource("../../").getPath().replaceAll("%20", " ")

风过留痕 8683

4 轴穿越机 Mark5 机架全解析:从历史演进到电机桨叶选型指南

本文围绕 4 轴穿越机 Mark5 机架展开,先介绍其发展历程(2018 年初代到 2023 年五代,迭代优化轻量化、刚性与兼容性),再明确其核心参数(轴距 220mm、兼容 4-6 寸桨等)对电机桨叶的约束。 详解电机(KV 值、尺寸、推力等)与桨叶(尺寸、螺距、材质等)选型要点及匹配原则(高 KV 配小桨、低 KV 配大桨),给出推重比、功率等理论计算公式,结合新手练习、花飞、竞速、航拍等场景提供具体选型案例,最后提及安全、成本、法规等注意事项,为爱好者提供全面选型参考。

bother3000的博客 1899

二叉树的遍历(非递归)

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

m0_61433144的博客 9117

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9187

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

4. 二叉树的创建及求解二叉树的宽度

【问题描述】求解二叉树的宽度,请用递归和非递归两种方法求解。 【输入形式】前序和中序序列建树 【输出形式】递归和非递归求解的宽度值 【样例输入】 abcdefg cbdaegf 【样例输出】 3 3 #include <iostream> using namespace std; #include <cstring> #include <queue> struct node { char data; node *lchild; n

m0_63168183的博客 1116

量产导入 | 产品可靠性测试标准完整大集合(JEDEC/IEC/SAE…)

产品可靠性测试是产品质量保证中的重要一环, 包含有Pre-con, aging(寿命)和ESD(静电)等, 下面就收集了权威标准JEDEC全系列, 请参照如下 同时也附上其它的可靠性标准供大家参考及交叉理解, 可能侧重点不同, 大家可以参考下。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1660

【算法归纳】二叉树遍历的非递归算法

二叉树遍历的常规算法是递归,通过一个栈可实现非递归算法,许多关于树的算法题都是这些非递归算法的变形,需要熟练掌握。 特别注意后序遍历的特殊性,在回溯时需要判断右子树是否已经访问过。 1、前序遍历 public void pre(TreeNode node) { Stack<TreeNode> stack = new Stack<>(); TreeNode cur = node; while(cur!=null || !stack.isEmpty()) {

Steven_L_的博客 1355

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

数据结构(C语言)有关二叉树的相关算法题及思考

数据结构(C语言)有关二叉树的相关算法题及思考 1.实验目的(结出本次实验所涉及并要求掌握的知识点) 1、掌握二叉树的动态存储结构及表示方法 2、掌握二叉树的前序、中序和后序遍历的递归和非递归算法、掌握二叉树的层次遍历算法。 3、运用二叉树的3种遍历算法求解基于二叉树的有关问题。 2.实验内容(结出实验内容具体描述) ①编写算法函数void preorder1(bintree t)实现二叉树t的非递归前序遍历。 ②编写算法函数void levelbintree(bintree t),实现二叉树的层次遍历。

Weightlessly的博客 3625

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

算法题(1) 二叉树遍历算法(递归与非递归)

栈结构下的二叉树遍历算法总结(代码后续完成) 学习目标: 本文章为大家梳理一下非递归的二叉树遍历算法设计流程,方便大家有一个直观的了解。 一、引言 二叉树的遍历想必大家都已经很熟悉了,二叉树主要分前序遍历、中序遍历、后续遍历和层次遍历四种迭代方式,相关的算法设计我们也能熟练掌握。在日常算法设计中,我们一般采用递归算法的思想来完成二叉树的四种遍历。本文带大家一起总结一下二叉树的非递归遍历算法流程,包含二叉树的前序、中序和后序遍历序列算法。 二、递归算法回顾 递归是算法设计中的一个重要思想,其包含两个基本部分:

PennyYu123的博客 669

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构二叉树的相关代码(伪码)

数据结构考研代码伪码总结 二叉树的递归遍历 1.前序遍历 void PerOrder(BiTree T){ BiTree p=T; if(p){ visit(p);//访问节点并输出 PerOrder(p->lchild);//递归访问左子树 PerOrder(p->rchild);//递归访问右子树 } } 2.中序遍历 void InOrder(BiTree T){ BiTree p=T; if(p){ InOrder(p->lchild);//

桃子的博客 2539

找二叉树中给定元素的的左孩子结点_[校招-算法题] 二叉树基础算法1

二叉树是面试中常考的数据结构,因为涉及大量指针操作,因此可以考察思维的严谨性和灵活性。但是校招中的二叉树题规律性很强,因此需要总结一下。各种常见的二叉树概念二叉树:每个结点最多有两个子树(左子树和右子树)的树结构。节点的层次:一个结点的层次直观上来说就是其所在的行,其中根结点层次为1。二叉树的深度:二叉树的深度指二叉树的最大叶子结点所在的层。二叉树的深度求解可用递归方式实现,等于max(左子树深度...

weixin_39610774的博客 419

c++编写算法判断二叉树是否为完全二叉树_[校招-算法题] 二叉树基础算法1

二叉树是面试中常考的数据结构,因为涉及大量指针操作,因此可以考察思维的严谨性和灵活性。但是校招中的二叉树题规律性很强,因此需要总结一下。各种常见的二叉树概念二叉树:每个结点最多有两个子树(左子树和右子树)的树结构。节点的层次:一个结点的层次直观上来说就是其所在的行,其中根结点层次为1。二叉树的深度:二叉树的深度指二叉树的最大叶子结点所在的层。二叉树的深度求解可用递归方式实现,等于max(左子树深度...

weixin_29924243的博客 623

算法题:二叉树遍历总结

左 → 右 → 根 | 递归左子树,递归右子树,最后记录当前节点 || 左 → 根 → 右 | 递归左子树,记录当前节点,递归右子树 |对比总结二叉树三中遍历方式(递归方式 和 非递归方式)

Growth Diary 266

67. 二叉树的中序遍历

提示        LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求       描述                给出一棵二叉树,返回其中序遍历           样例给出二叉树 {1,#,2,3},1 \ 2 / 3返回 [1,3,2].挑战你能使用非递归算法来实现么?解题思路       使用递归,只是在保存元素的顺序和前序不...

Oeljeklaus的博客 1190

数据结构算法题个人笔记——二叉树篇

2020/11/16前言题目一:翻转二叉树 前言 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; 题目一:翻转二叉树 /* 题目来源:https://leetcode-cn.com/problems/invert-binary-tree/ */ struct TreeNode* invertTree(struct TreeNode* root){ if(!

qq_43135556的博客 1231

C++二叉树实现:从节点定义到遍历与内存管理

数据结构是计算机科学的核心基础,其中树形结构因其高效的层次化数据组织能力而被广泛应用。二叉树作为树结构的基础模型,通过节点与指针的链接,实现了数据的分治与递归管理,其核心价值在于为高效搜索、排序及动态数据操作提供了底层支持。在算法面试与系统开发中,二叉树的遍历(如前序、中序、后序的递归与非递归实现)、节点操作及内存管理是必备技能。本文以C++为例,详细解析了二叉树的节点结构体设计、层序插入策略,并深入探讨了深度优先遍历的递归与栈实现,以及如何通过后序遍历安全释放内存,避免内存泄漏。通过结合队列实现层序遍历和

437

数据结构算法整理-05-二叉树

二叉树1. 定义2. 前序遍历3. 中序遍历4. 后序遍历5. 前序遍历的非递归算法 (了解)6. 创建二叉树7. 删除二叉树8. 二叉树深度计算9. 计算结点总数10. 计算叶子结点总数11.广义表的形式输出二叉树结构记忆总结 以下基本都是用递归实现 1. 定义 #include <stdio.h> #include <stdlib.h> #define Maxs...

weixin_43367550的博客 474

【408数据结构】树(一)

树主要是应用题偏多。(算法题只考过了两次,都挺简单的,就是一个遍历;算法题在下一篇) 思维导图 基本概念 养成习惯:区分度和度之和: 结点个数=总度+1 度:指一棵树中,每一个结点度的最大值 链式 链式存储如果考多叉树,只有可能是孩子表示法那一块。 因此,大题只可能是二叉树那块。 遍历 递归遍历很简单。 void preOrder(Node *p) { if(p!=NULL) { visit(p); preOrder(p->lchild); preOrder(p->rc.

For Infinite 1495

《github一天一道算法题》:搜索二叉树接口实现大合集

读书、思考、写代码! 说明: (1)这里实现了搜索二叉树的全部常用操作 (2)限于时间和精力,实现的较为粗糙,内存泄露、成员变量访问控制、返回类型、异常安全等没有照顾的到 (3)一切实现的手段都是贴近底层操作,关注原理。以后可能对推倒重来,实现一个完备的接口系统。 /********************************************* * copyright@hus

hustyangju的足迹 1536
上一篇: 【算法题】字符串的全排列
下一篇: 【编程之美】读书笔记:求二进制数中1的个数
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值