C++—非递归【循环】遍历二叉树(前序,中序,后序)思路讲解+代码实现

本文介绍了如何使用循环而非递归的方法来遍历二叉树,分别展示了前序、中序和后序遍历的详细过程和代码实现,利用栈来辅助操作。在前序遍历中,首先访问根节点和左子树,然后处理右子树;中序遍历顺序为左-根-右;后序遍历需先遍历完左右子树再处理根节点。

非递归遍历二叉树


接下来我们在研究如何使用循环实现遍历二叉树时,以下面的二叉树为例:
在这里插入图片描述
在下文的讲解中,不对如何构建这颗二叉树做讲解,直接给出代码,如果有不懂的地方欢迎私信我。

文章中的完整源代码链接在结尾处。

前序

先来讲解前序。
前序的遍历顺序为:根-左-右,所以以上面的这棵树为例,前序遍历的结果就应该为:3 1 0 2 4 5
我们要遍历这颗树,不适用递归的话,就只能使用循环的方式来了。

思路讲解:
根据前序的遍历顺序我们不难发现,我们首先要先将根节点和左子树遍历完才能遍历右子树,所以我们可以先循环遍历到这颗树的最左结点,同时将结点的值存放在vector中。如下图所示:
在这里插入图片描述
接下来我们就要考虑的是,如何遍历右子树的问题。
其实也不难,我们只需要使用一个栈,在vector存在结点的值的同时,将结点也存放在栈结构中即可,即在上图的遍历完成后我们还能得到一个下图所示的栈:
在这里插入图片描述
在上图中我们已经完成了0结点和0结点的左子树的遍历,因为0结点的左子树为空所以本次循环结束,接下来我们只需要取栈顶元素,即0结点,让栈顶元素的右子树按照同样的方式进行遍历即可。

因为0的右子树也为空,所以下次循环直接结束,再取栈顶元素的时候,因为0已经被取走了,再取就是1结点了,1结点的右子树不为空,所以2入vector和栈。
上诉过程如下图所示:
在这里插入图片描述
然后就是以同样的方式去遍历整颗树。
代码如下:

//前序遍历
vector<int> preorderTraversal(TreeNode* root) 
{
   
   
    //非递归,借助栈来实现
    //分为两大的问题,一,左路结点, 二,左路节点的右子树
    stack<TreeNode*> st;
    vector<int> arr;

    TreeNode* cur = root;
    while (cur || !st.empty()
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山忆874

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值