专业游戏门户,分享手游网游单机游戏百科知识攻略!

嗨游网
嗨游网

中序遍历是怎么遍历的

来源:小嗨整编  作者:小嗨  发布时间:2024-03-16 08:49
摘要:中序遍历的遍历方法为:对于当前结点,首先遍历左子树,然后访问当前节点,最后遍历右子树。中序遍历是二叉树遍历的一种,也叫做中根遍历、中序周游。本教程操作环境:windows7系统、C++17版本、DellG3电脑。二叉树是一种重要的数据结构...

中序遍历的遍历方法为:对于当前结点,首先遍历左子树,然后访问当前节点,最后遍历右子树。中序遍历是二叉树遍历的一种,也叫做中根遍历、中序周游。

中序遍历是怎么遍历的

本教程操作环境:windows7系统、C++17版本、Dell G3电脑。

二叉树是一种重要的数据结构,对二叉树的遍历也很重要。这里简单介绍三种二叉树中序遍历的方法。二叉树的中序遍历就是首先遍历左子树,然后访问当前节点,最后遍历右子树。对于下面的二叉树,中序遍历结果如下:

结果:[5,10,6,15,2]

直观来看,二叉树的中序遍历就是将节点投影到一条水平的坐标上。如图:

1、递归法

这是思路最简单的方法,容易想到并且容易实现。递归的终止条件是当前节点是否为空。首先递归调用遍历左子树,然后访问当前节点,最后递归调用右子树。代码如下:

//recursiveclass Solution1 {public:    vector inorderTraversal(TreeNode* root) {        vector ret;        if(root==NULL)return ret;        inorderHelper(ret,root);        return ret;    }private:    void inorderHelper(vector& ret,TreeNode* root)    {        if(root==NULL)return;        inorderHelper(ret,root->left);        ret.push_back(root->val);        inorderHelper(ret,root->right);    }};
登录后复制

2、迭代法

在迭代方法中,从根节点开始找二叉树的最左节点,将走过的节点保存在一个栈中,找到最左节点后访问,对于每个节点来说,它都是以自己为根的子树的根节点,访问完之后就可以转到右儿子上了。代码如下:

//iterate,using a stackclass Solution2 {public:    vector inorderTraversal(TreeNode* root) {        vector ret;        if(root==NULL)return ret;        TreeNode *curr=root;        stack st;        while(!st.empty()||curr!=NULL)        {            while(curr!=NULL)            {                st.push(curr);                curr=curr->left;            }            curr=st.top();            st.pop();            ret.push_back(curr->val);            curr=curr->right;        }        return ret;    }};
登录后复制

这种方法时间复杂度是O(n),空间复杂度也是O(n)。

3、Morris法

这种方法是Morris发明的,看完之后感觉精妙无比。这种方法不使用递归,不使用栈,O(1)的空间复杂度完成二叉树的遍历。这种方法的基本思路就是将所有右儿子为NULL的节点的右儿子指向后继节点(对于右儿子不为空的节点,右儿子就是接下来要访问的节点)。这样,对于任意一个节点,当访问完它后,它的右儿子已经指向了下一个该访问的节点。对于最右节点,不需要进行这样的操作。注意,这样的操作是在遍历的时候完成的,完成访问节点后会把树还原。整个循环的判断条件为当前节点是否为空。例如上面的二叉树,遍历过程如下(根据当前节点c的位置):

(1)当前节点为10,因为左儿子非空,不能访问,找到c的左子树的最右节点p:

结果:[]

(2)找节点c的左子树的最右节点有两种终止条件,一种右儿子为空,一种右儿子指向当前节点。下面是右儿子为空的情况,这种情况先要构造,将节点p的右儿子指向后继节点c,然后c下移:

结果:[]

(3)当前节点c的左儿子为空,进行访问。访问后将c指向右儿子(即后继节点):

结果:[5]

(4)继续寻找左子树的最右节点,这次的终止条件是最右节点为当前节点。这说明当前节点的左子树遍历完毕,访问当前节点后,还原二叉树,将当前节点指向后继节点:

结果:[5,10]

(5)重复上述过程,直到c指向整棵二叉树的最右节点:

左儿子为空,进行访问,c转到右儿子。右儿子为空,不满足判断条件,循环结束,遍历完成。结果如下:

[5,10,6,15,2]

这就是Morris方法,时间复杂度为O(n),空间复杂度是O(1)。代码如下:

//Morris traversal,without a stackclass Solution3 {public:    vector inorderTraversal(TreeNode* root) {        vector ret;        if(root==NULL)return ret;        TreeNode *curr=root;        TreeNode *pre;        while(curr)        {            if(curr->left==NULL)            {                ret.push_back(curr->val);                curr=curr->right;            }            else            {                pre=curr->left;                while(pre->right&&pre->right!=curr)                    pre=pre->right;                if(pre->right==NULL)                {                    pre->right=curr;                    curr=curr->left;                }                else                {                    ret.push_back(curr->val);                    pre->right=NULL;                    curr=curr->right;                }            }        }        return ret;    }};
登录后复制

推荐教程:《C#》

以上就是中序遍历是怎么遍历的的详细内容,更多请关注易企推科技其它相关文章!


本文地址:网络百科频道 https://www.eeeoo.cn/wangluo/1148554.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!


网络百科
小编:小嗨整编
相关文章相关阅读
  • 荔枝app录音怎么导出音频(荔枝app的音频怎么转成mp3格式)?

    荔枝app录音怎么导出音频(荔枝app的音频怎么转成mp3格式)?

    荔枝app录音怎么导出音频(荔枝app的音频怎么转成mp3格式)?荔枝app作为一款流行的音频录制与分享平台,让许多用户可以在其中录制属于自己的声音。但有时候,我们可能需要将荔枝app中的录音导出为MP3格式,以便在其他设备上播放。本文将为...

  • 华为应用商店app官网(华为应用商店app怎么下载)?

    华为应用商店app官网(华为应用商店app怎么下载)?

    华为应用商店app官网(华为应用商店app怎么下载)?华为应用商店App作为华为手机用户的首选应用下载平台,提供了丰富的应用程序、游戏资源,同时也保证了应用的安全性和稳定性。那么,如何从官网下载华为应用商店App呢?本文将为您详细介绍。一、...

  • 淘宝app怎么打开(淘宝app在哪里找)?

    淘宝app怎么打开(淘宝app在哪里找)?

    淘宝app怎么打开(淘宝app在哪里找)?在现代生活中,淘宝App已经成为我们购物的重要工具之一。那么,淘宝App到底怎么打开?又该如何找到并下载它呢?本文将为您详细解答。一、淘宝App的下载方法1.通过手机应用商店下载对于安卓用户:打开手...

  • 魔兽世界泰兰德是什么职业(魔兽世界泰兰德幻化怎么获得)?

    魔兽世界泰兰德是什么职业(魔兽世界泰兰德幻化怎么获得)?

    魔兽世界泰兰德是什么职业(魔兽世界泰兰德幻化怎么获得)?在魔兽世界中,泰兰德是魔兽世界中暗夜精灵种族的代表性角色,她以牧师职业为主。牧师在游戏中拥有强大的治疗和辅助能力,是团队中不可或缺的重要角色。泰兰德作为一名牧师,擅长使用圣光和暗影之力...

  • 魔兽世界恶魔术士天赋加点(魔兽世界恶魔术士属性怎么堆)?

    魔兽世界恶魔术士天赋加点(魔兽世界恶魔术士属性怎么堆)?

    魔兽世界恶魔术士天赋加点(魔兽世界恶魔术士属性怎么堆)?在魔兽世界中,恶魔术士是一个以高爆发和持续伤害著称的职业。合理的天赋加点对于恶魔术士的输出至关重要。本文将为您详细介绍恶魔术士的天赋加点方法,以及如何高效堆叠属性。魔兽世界恶魔术士天赋...

  • lol道聚城怎么赠送皮肤(lol道聚城优惠券领取)?

    lol道聚城怎么赠送皮肤(lol道聚城优惠券领取)?

    lol道聚城怎么赠送皮肤(lol道聚城优惠券领取)?lol道聚城作为英雄联盟的官方周边商城,提供了丰富的游戏周边产品和优惠活动。在道聚城中,赠送皮肤成为了许多玩家表达友谊与支持的方式。下面将为您详细介绍如何在lol道聚城赠送皮肤,以及如何领...

  • lol小丑的名字叫什么(lol小丑怎么分辨真假)?

    lol小丑的名字叫什么(lol小丑怎么分辨真假)?

    lol小丑的名字叫什么(lol小丑怎么分辨真假)?在lol英雄联盟中,小丑(Janna)作为一位辅助英雄,以其独特的技能和出色的辅助能力深受玩家喜爱。然而,许多玩家在游戏中可能遇到真假小丑难以辨别的问题。本文将为大家详细解析LOL小丑的名字...

  • dnf格斗大赛黄金套外观(dnf格斗大赛装扮兑换券怎么获得)?

    dnf格斗大赛黄金套外观(dnf格斗大赛装扮兑换券怎么获得)?

    dnf格斗大赛黄金套外观(dnf格斗大赛装扮兑换券怎么获得)?在dnf中,格斗大赛黄金套一直是玩家们梦寐以求的稀有装扮。这套装扮不仅外观炫酷,而且属性强大,深受玩家们的喜爱。那么,黄金套的外观究竟如何,我们又该如何获得兑换券呢?本文将为您一...

  • 周排行
  • 月排行
  • 年排行

精彩推荐