一招吃透二叉树遍历

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

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

二叉搜索树的遍历

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

前序遍历

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

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

例如下图中二叉树前序遍历节点访问顺序为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

相关推荐

  • 怎么开淘宝网店新手入门

    1、卖家中心加入步骤: 打开淘宝网,登录店铺帐户,点击右上角【我的淘宝】–【卖家中心】–【营销中心】–【我要推广】–【营销入口】&#…

    2023年 4月 9日
  • word文字如何转换成表格

    有的人使用office办公软件时,常常会在Word中加入表格,这时候我们一般想到的是,建立表格,然后一格一格的填写;或者用Excel表格制作在复制到Word文档中。其实在Word中…

    2023年 4月 16日
  • 购买火车票如何添加免票儿童(火车票多少岁以下儿童免费)

    新版《铁路旅客运输规程》 于2023年1月1日起施行 购买儿童票有了新规定 来了解一下吧 随同成年人乘车的儿童,年满6周岁且未满14周岁的应当购买儿童优惠票;年满14周岁,应购买全…

    2023年 4月 21日
  • 如何修改电脑ip地址

    打开【设置】对话框 方法一:鼠标移动到电脑右下角小地球上面,点击鼠标右键,在弹出的选项中选择【打开“网络和Internet设置”】 方法二:当然也可以点击【开始】-【设置】-【网络…

    2023年 6月 15日
  • 高压电缆故障测试仪的使用

    在电缆的现场敷设过程中电缆护套表面刮伤破损的现象是普遍存在的,损伤轻微的只伤及了护套,如何修补能保证质量,而且修补时间短,又能保证质量日益成为电缆消费者普遍关心的问题。而且投入小,…

    2023年 5月 8日
  • 如何做一个微信朋友圈的h5

    如何做一个微信朋友圈的H5? 调查问卷H5链接怎么做? 毕业设计市场调查H5问卷要怎么做? 免费在线制作市场H5调查问卷 微信调查问卷H5链接制作教学 朋友圈分享的H5调查问卷该这…

    2023年 4月 17日
  • 提前搞明白京东这两种会员体系(中信京东plus卡怎么领取plus会员)

    马上又到一年一度的618购物节了,这也是每家电商平台的年中大促,优惠力度并不会输给双11和双12,所以各位值友可以开始准备准备,购物资金到位肯定是首要条件,然后是各家银行的信用卡也…

    2023年 4月 1日
  • 京东e卡怎么回收变现

    京东e卡大家并不陌生,是京东发行购买京东自营商品的购物卡。如果我们手中有京东e卡可以先查看一下是否是全品类,全品类的可以购买京东里所有京东自营的商品,如果是一些品类的京东e卡,比如…

    2023年 5月 22日
  • 为什么微信红包不能撤回了(微信红包怎么不能撤回)

    在微信上,各类在聊天框中发布的内容都可以撤回,但是唯独红包不可以?那么这么设计背后有什么深意吗?我们又要如何理解呢? 我看到这个问题的第一反应是:嗯?不能撤回吗?哦,是不能撤回。 …

    2023年 7月 2日
  • pbe测试服无法连接至验证服务

    新赛季的《云顶之弈》主题为“怪兽来袭”。在新版本中,英雄强化将为玩家提供三种英雄强化选择,你可以从中选择一种,为你的英雄小队确定自己的领 袖。每个弈子都有两种专属的英雄强化。这样可…

    2023年 10月 5日