二叉树的前序、中序、后续、层序遍历(包含递归与非递归)

递归形式

递归形式遍历比较简单,不做详细论述。
前序遍历

void  Preorder(treenode* root)   //前序
{if (root != NULL){printf("%c", root->data);Preorder(root->left);Preorder(root->right);}

中序遍历

}
void  Inorder(treenode* root)    //中序
{if (root != NULL){	Inorder(root->left);printf("%c", root->data);Inorder(root->right);}}

后序遍历

void  Postorder(treenode* root)     //后序
{if (root != NULL){Postorder(root->left);Postorder(root->right);printf("%c", root->data);}
}

非递归形式

前序遍历
开始不断向左孩子遍历并入栈,在入栈的同时打印节点数据,直到左孩子为空,此时获取栈顶节点,并将其出栈,判断其有无右孩子,如果无右孩子,就再次获取栈顶节点并出栈,重复上述操作;如果有右孩子就将其入栈,并不断遍历其左孩子直到为空,重复上述操作,直到栈为空。
在这里插入图片描述

void PreOrder(treenode* root)
{if (root == NULL)return;treenode* p = root;stack<treenode *> s;while (!s.empty() || p){//边遍历边打印,并存入栈中while (p){printf("%c ", p->data);s.push(p);p = p->left;}//当p为空时,说明根和左子树都遍历完了,进入右子树if (!s.empty()){p = s.top();s.pop();p = p->right;}}
}

中序遍历
从根节点开始不断向左孩子遍历并入栈,直到为空,只要没有左孩子就出栈,在出栈的同时就打印节点数据,此时在判断出栈节点是否有右孩子,如果有右孩子重复上述操作继续向左孩子遍历,如果没有就出栈,重复上述操作判断有无右孩子,直到栈为空就退出遍历。
在这里插入图片描述

void InOrder(treenode* root)
{//空树if (root == NULL)return;//树非空treenode* p = root;stack<treenode *> s;while (!s.empty() || p){//一直遍历到左子树最下边,边遍历边保存根节点到栈中while (p){s.push(p);p = p->left;}//当p为空时,说明已经到达左子树最下边,这时需要出栈了if (!s.empty()){p = s.top();s.pop();printf("%c ", p->data);//进入右子树p = p->right;}}
}

后序遍历
后续在理解上较为难,用两个栈s1,s2更为直观,便于理解。
首先将根节点放入s2,再将其左右孩子放入s1中,一定要先放入左孩子,再放入右孩子,此时在获取s1栈顶节点并出栈,判断其是否有左右孩子,只要有孩子就将该节点入栈s2,并将该节点左右孩子放入s1中;如果该节点无左右孩子那么直接出栈s2并入栈s1,重复上述操作直到s1为空,在将s2从栈顶打印到栈底便是后续遍历
在这里插入图片描述

void PostOrder(treenode *root)
{stack<treenode *>s1, s2;treenode *cur=root; s1.push(cur);//入栈根节点while (!s1.empty()){cur = s1.top();//出栈s1入栈s2s1.pop();s2.push(cur);//判断是否有左右孩子,有则入栈s1if (cur->left)s1.push(cur->left);if (cur->right)s1.push(cur->right);}while (!s2.empty()){printf("%c ", s2.top()->data);//打印s2s2.pop();}
}

层序遍历
层序遍历需要用到队列,先入队根节点,在出队,将其左右孩子入队,依次出队入队操作,只要该节点有孩子就入队,再出队的同时打印节点数据
在这里插入图片描述

void sequence(treenode *root)
{deque<treenode *>q;treenode *cur = root;q.push_back(cur);//根节点入队while (!q.empty()){cur = q.front();//获取队头q.pop_front();printf("%c ", cur->data);//孩子入队if (cur->left)q.push_back(cur->left);if (cur->right)q.push_back(cur->right);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 1-6 课:玩转时间 + 面试题

在 JDK 8 之前,Java 语言为我们提供了两个类用于操作时间,它们分别是:java.util.Date 和 java.util.Calendar,但在 JDK 8 的时候为了解决旧时间操作类的一些缺陷,提供了几个新的类,用于操作时间和人气,它们分别是:LocalTime、LocalDateTime、Instant,都位于 java.time…

单调递增子序列

单调子序列包含有单调递增子序列和递减子序列&#xff0c;不失一般性&#xff0c;这里只讨论单调递增子序列。首先&#xff0c;从定义上明确我们的问题。给定序列a1, a2, …, an&#xff0c;如果存在满足下列条件的子序列 ai1<ai2<…<aim, (其中i1<i2<…<im)…

HTML文本框内容发生变化时引发事件执行

最近在做的程序中需要这样的一个功能:当HTML文本框内容生发变化时执行JavaScript函数.最初的想法是使用onchange,但这个事件只有当文本框失去焦点时才会触发,后来就找到了onpropertychange事件.如下:<input id"textRoad" type"text" size"15"…

第 1-5 课:深入了解 Java 中的异常处理 + 面试题

在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点。比如,try-catch 处理要遵循的原则是什么,finally 为什么总是能执行,try-catch 为什么比较消耗程序的执行性能等问题,我们本篇内容都会给出相应的答案,当然还有面试中经常被问到…

java math 类_Java Math类静态双层(double d)示例

java math 类数学班静态双层(双D) (Math Class static double floor(double d)) This method is available in java.lang package. 此方法在java.lang包中可用。 In this method if the value of the given positive argument after decimal point is 0 or greater than 0 so i…

在win server 2003上安装SQL Server 2008的步骤

1.安装Microsoft .NET Framework 3.5 Service Pack 1&#xff0c;下载地址&#xff1a;http://www.microsoft.com/zh-cn/download/confirmation.aspx?id22 2.运行SQL Server 2008安装包&#xff0c;安装过程中会提示需要重启&#xff0c;手动重启。 3.重启后若直接再次运行SQL…

使用onclick跳转到其他页面/跳转到指定url

如果是本页显示可以直接用location,方法如下&#xff1a;①οnclick"javascript:window.location.hrefURL"②οnclick"locationURL"③οnclick"window.location.hrefURL?id11"如果页面中有frame可以将在location前面添加top.mainframe.frames[r…

第 2-1 课:类与 Object + 面试题

类介绍 Java 程序是由若干个类组成的,类也是面向对象编程思想的具体实现。 以下为类的基本使用: public class Cat {// 私有属性private String name;private int age;// 构造方法public Cat() {}// 普通方法public void eat() {System.out.println("吃吃吃");}…

expm1_Java Math类静态double expm1(double d)及其示例

expm1数学类静态double expm1(double d) (Math Class static double expm1(double d)) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return [ the exponential of the given number – 1] in the method or in other …

51单片机常用功能及相关内容

一、基本概念&#xff1a; 1、引脚 图1.1 这里只介绍常用及主要的引脚。 I/O口引脚&#xff1a;P0、P1、P2、P3 P0口&#xff1a;39脚~32脚&#xff0c;双向8位三态I/O口&#xff0c;每个口可独立控制&#xff0c;但内部无上拉电阻&#xff0c;为高阻态&#xff0c;故不能正常…

No monitoring data is available

No monitoring data is available because monitoring is not enabled for this deployment share...注解&#xff1a;没有监测数据是可用的。报错具体信息如下&#xff1a;Assembly: mscorlib Assembly Version: 2.0.0.0 File Version: 2.0.50727.5420 (Win7SP1.050727-5400…

oracle chr()和字符连接

SQL> select chr(105)||chr(32)||chr(108)||chr(111)||chr(118)||chr(101)||chr(32)||chr(121)||chr(111)||chr(117) as hi from dual;

第 1-7 课:数组和排序算法 + 面试题

数组的定义与使用 数组是 Java 编程中最重要的数据结构之一,也是最基本的数据结构,Java 中的常用集合 ArrayList、HashMap 等内部的实现都使用到了数组结构。数组是只能用来存储一种类型的集合,可以通过下标访问数值中的所有元素。 数组的声明方式有以下两种,如整数型数组…

gethours_日期getHours()方法以及JavaScript中的示例

gethoursJavaScript Date getHours()方法 (JavaScript Date getHours() method) getHours() method is a Dates class method and it is used to get the only hours from current time. getHours()方法是Date的类方法&#xff0c;用于获取距当前时间仅有的小时数。 It accept…

单词助手(可联网)

基本功能 1. 可实现对本地词库添加、删除单词功能 2. 可实现查词功能&#xff0c;根据英文查释义&#xff0c;优先从本地词库查询&#xff0c;如果本地词库没有就自动网上查询&#xff0c;并将其添加至本地词库 3. 可实现学习功能&#xff0c;每天50词&#xff0c;可分批次学习…

Unity查安卓Native Crash的方法,定位SO报错函数

需要用到两个工具Il2CppDumper和IDA_Pro&#xff0c;网上可以下到对应的软件 可以看到报错的位置是libil2cpp.so 0000000000AFF820 接下来要做的事情就是找到0000000000AFF820对应的函数是哪个 解包 Il2CppDumper解析so文件和符号表&#xff0c;查看对应的函数表 把apk后缀…

WebApi系列~自主宿主HttpSelfHost的实现

回到目录 宿主一词我们不会陌生&#xff0c;它可以看作是一个基础设施&#xff0c;它为一些服务和功能提供最底层的支持&#xff0c;如你的web应用程序可以运行在iis或者apache上&#xff0c;而这两个东西就是web应用程序的宿主&#xff0c;而今天说的自主宿主SelfHost就是说&a…

第 2-2 课:各种内部类和枚举类 + 面试题

内部类不仅经常出现在各种面试题中,还会在 Java 源码中频频出现,因此只有搞明白了 Java 内部类,才能搞定面试和看懂各种 Java 源码。 内部类 Java 内部类,分为以下四种: 成员内部类静态成员内部类局部内部类匿名内部类下面分别来看这些内部类的使用。 成员内部类 定义…

linux系统层次结构_Linux文件系统层次结构问题和解答

linux系统层次结构This section contains Aptitude Questions and Answers on Linux Filesystem Hierarchy. 本节包含有关Linux文件系统层次结构的 Aptitude问答。 1) There are the following statements that are given below, which of them are correct about Linux File …

plsql developer 安装在win7 64位电脑路径问题

plsql developer 如果安装在win7 64位电脑上&#xff0c;安装目录不能有括号或者中文等特殊字符&#xff0c;默认安装路径是C:\Program Files (x86)。——