一招吃透二叉树遍历

作者:上善若水 来源:公众号码农有道

在通俗易懂讲解 二叉搜索树一文中主要介绍了二叉搜索树的性质,本文将继续介绍二叉树的遍历。

二叉搜索树的遍历

遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同主要分为前序遍历,中序遍历,后序遍历。注意,二叉搜索树和普通的二叉树其遍历是一模一样的,因此下文中,不区分是二叉搜索树还是二叉树。

前序遍历

对一颗二叉树的前序遍历操作如下:

  • 访问根节点
  • 前序遍历左子树
  • 前序遍历右子树

例如下图中二叉树前序遍历节点访问顺序为3 1 2 5 4 6:

通俗易懂讲解 二叉树遍历

根据前面所分析的前序遍历的操作步骤,不难看出很容易用递归的方法实现二叉树的前序访问:

//前序遍历递归版本void preOrder(struct node *root){ if(root != NULL) { cout << root->data << " "; preOrder(root->left); preOrder(root->right); }}

其实,还能以非递归的方式实现二叉树的前序遍历:由于在遍历完根节点后还要将其找回来以便遍历该根节点对应的右子树,因此可以考虑使用栈来存储访问过的根节点,代码实现如下:

通俗易懂讲解 二叉树遍历

中序遍历

对一颗二叉树的中序遍历操作如下:

  • 中序遍历左子树
  • 访问根节点
  • 中序遍历右子树

例如下图中二叉树中序遍历节点访问顺序为1 2 3 4 5 6:

通俗易懂讲解 二叉树遍历

如同前序遍历一样,也可以用递归或者非递归的方式实现,而且其思想也类似,只是访问的顺序不一样了,其两种实现方式如下:

//中序遍历递归版本void inOrder(struct node *root){ if(root != NULL) { inOrder(root->left); //和前序遍历相比,只是输出语句换了个位置唯一 cout << root->data << " "; inOrder(root->right); }}

通俗易懂讲解 二叉树遍历

后续遍历

对一颗二叉树的后序遍历操作如下:

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根节点

例如下图中二叉树后序遍历节点访问顺序为2 1 4 6 5 3:

通俗易懂讲解 二叉树遍历

二叉树后序遍历递归版本与前序中序类似,如下:

//后序遍历递归版本void postOrder(struct node *root){ if(root != NULL) { postOrder(root->left); postOrder(root->right); //最后访问根节点 cout << root->data << " "; }}

后序遍历的非递归算法较复杂,使用一个栈可以实现,但是过程很繁琐,我们可以考虑用两个栈来实现后序遍历的非递归算法。注意到后序遍历可以看作是下面遍历的逆过程:即先遍历某个结点,然后遍历其右孩子,然后遍历其左孩子。这个过程逆过来就是后序遍历。算法步骤如下:

(1) push根结点到第一个栈s中。

(2) 从栈s中pop一个结点,将其push到栈output中。

(3) 然后push结点的左孩子和右孩子到第一个栈s中。

(4) 重复过程2和3直到栈s为空。

(5) 现在所有结点已经push到栈output中,且按照后序遍历的顺序存放,直接全部 pop出来即是二叉树后序遍历结果。

代码实现如下:

通俗易懂讲解 二叉树遍历

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 7月 18日 上午9:21
下一篇 2023年 7月 18日 上午9:31

相关推荐

  • “微石楼”新年献词:2020,让我们继续追梦前行

    “微石楼”新年献词: 2020,让我们继续追梦前行!   时光呼啸,斗转星移。岁月的年轮又悄然画过一圈,2020如约而至。站在时间轴的节点上,深情回望,一路走来,不论严寒酷暑、风霜…

    互联网 2023年 5月 24日
  • qq内测新功能,和微信互通了吗

    微信近期的每次更新,都能看到QQ的影子。很难不让人怀疑,微信开始向QQ靠拢,网友吐槽,“干脆将微信和QQ互通或合并好了”…… 合并大概率是没希望的,至于互通…

    2023年 1月 3日
  • 快播是怎么消失的啊,王者荣耀快播消失了怎么办

    突然想到快播这个学生时期用过的视频软件,只知道当时一夜之间就被封了,没有细究, 既然想起来了,就顺便查了一下他消失的原因。 针对这个问题,首先,我们应该了解一下快播这个概念。 什么…

    互联网 2023年 7月 6日
  • mpp电力管生产厂家怎么选

    河北塑龙管道:mpp专业制造12年。 mpp电力管厂家如何选择可靠的?塑龙管道有以下建议: 1、首先评估mpp电力管厂家的产品质量和服务水平,包括产品质量、生产过程和可靠性,以确保…

    2023年 4月 19日
  • qq号被盗了,怎么弄回来?,qq被盗了qq绑定的微信要解绑吗

    曾几何时,qq是我们社交领域的最爱。就算是在今天,qq空间仍旧是许多人最钟爱的私密空间。因此,qq号被盗的事,让许多网友倍感痛心。那么,qq号被盗了怎么办呢?今天,公众号:孙师傅小…

    2023年 3月 11日
  • 手机电脑文件互传神器(电脑手机蓝牙互传文件)

    现在手机功能越来越全,我们很多的工作或者学习都在手机上就能完成。但是经常还是需要从手机里面导一些文件到电脑,或者从电脑导文件到手机。比如你的领导通过微信给你发了一个文档,让你处理一…

    2023年 2月 19日
  • 余额宝的收益越来越低了怎么办

    最近看了不少因为负利率而焦虑的文章,在CPI超过4%,而1年期定期存款利率还不到2%的当下,我们大部分人确实处于“负利率”时代。 对于很多稳健型投资者来说,前一两年,还有余额宝等“…

    2022年 12月 27日
  • 网上卖衣服销售技巧和话术经典

    当越来越多实体服装店投入到做网上生意时,比如说直播,那对于销售范围上来说,只会是更有利。 以前由于店铺只能卖周围的消费者,而现在呢,则可以面对全国,只要转变一下思路,完全可以打开更…

    2023年 8月 27日
  • 再有人说密码记不住,把这篇文章扔给他

    世界上难办的事情分为两种:一种是困难的,一种是麻烦的。 密码管理是第二种。 密码管理,是属于那种如果简单了,就容易被盗,而如果复杂了,又容易记不住的事情。 本期内容就来彻底帮大家解…

    2022年 12月 20日
  • 公司怎么申请微信支付宝收款码(申请微信支付宝银联三合一收款码)

    公司怎么申请微信支付宝收款码,企业收款码同时支持:微信,支付宝,云闪付,花呗,信用卡全渠道支付,客户只需通过:微信,支付宝,云闪付,扫企业收款码就可以直接支付,银联直接结算,支持:…

    2023年 10月 22日