博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的前中后序遍历(迭代法)(带动画)
阅读量:1984 次
发布时间:2019-04-27

本文共 1774 字,大约阅读时间需要 5 分钟。

在这里插入图片描述

友链:

前序遍历

递归思路:先树根,然后左子树,然后右子树。每棵子树递归。在迭代算法中,思路演变成,每到一个节点 A,就应该立即访问它。

因为,每棵子树都先访问其根节点。对节点的左右子树来说,也一定是先访问根。
在 A 的两棵子树中,遍历完左子树后,再遍历右子树。

因此,在访问完根节点后,遍历左子树前,要将右子树压入栈

动画演示

在这里插入图片描述

伪代码

栈S;p= root;while(p || S不空){
while(p){
访问p节点; p的右子树入S; p = p的左子树; } p = S栈顶弹出;}

代码实现

vector
preorderTraversal(TreeNode* root) {
stack
S; vector
v; TreeNode* rt = root; while(rt || S.size()){
while(rt){
S.push(rt->right); v.push_back(rt->val); rt=rt->left; } rt=S.top();S.pop(); } return v; }

中序遍历

每到一个节点 A,因为根的访问在中间,将 A 入栈。然后遍历左子树,接着访问 A,最后遍历右子树。

在访问完 A 后,A 就可以出栈了。因为 A 和其左子树都已经访问完成。

伪代码

栈S;p= root;while(p || S不空){
while(p){
p入S; p = p的左子树; } p = S.top 出栈; 访问p; p = p的右子树;}

动画演示

在这里插入图片描述

代码实现

vector
inorderTraversal(TreeNode* root) {
stack
S; vector
v; TreeNode* rt = root; while(rt || S.size()){
while(rt){
S.push(rt); rt=rt->left; } rt=S.top();S.pop(); v.push_back(rt->val); rt=rt->right; } return v; }

后序遍历

后序遍历与前序遍历相对称。

思路: 每到一个节点 A,就应该立即访问它。 然后将左子树压入栈,再次遍历右子树。遍历完整棵树后,结果序列逆序即可。

伪代码

栈S;p= root;while(p || S不空){
while(p){
访问p节点; p的左子树入S; p = p的右子树; } p = S栈顶弹出;}结果序列逆序;

代码实现

vector
postorderTraversal(TreeNode* root) {
stack
S; vector
v; TreeNode* rt = root; while(rt || S.size()){
while(rt){
S.push(rt->left); v.push_back(rt->val); rt=rt->right; } rt=S.top();S.pop(); } reverse(v.begin(),v.end()); return v;}

转载地址:http://ywuvf.baihongyu.com/

你可能感兴趣的文章
Oracle 利用 UTL_SMTP 包发送邮件
查看>>
Oracle 的循环中的异常捕捉和处理
查看>>
Oracle的pfile和spfile的一点理解和笔记
查看>>
java实现稀疏数组及将稀疏数组存入硬盘中
查看>>
2021-05-18
查看>>
libuv实现ping包发送和接收
查看>>
基础架构系列篇-系统centos7安装docker+COMPOSE
查看>>
基础架构系列篇-NGINX部署VUE
查看>>
基础架构系列篇-系统centos7安装kafka
查看>>
软件质量的8个特性
查看>>
2021年不可错过的17种JS优化技巧(一)
查看>>
在 Vue 中用 Axios 异步请求API
查看>>
MySQL进阶查询(SELECT 语句高级用法)
查看>>
Mysql 之主从复制
查看>>
【NLP学习笔记】中文分词(Word Segmentation,WS)
查看>>
对于时间复杂度的通俗理解
查看>>
如何输入多组数据并输出每组数据的和?
查看>>
行阶梯型矩阵
查看>>
MATLAB指定路径保存图片方法
查看>>
JAVA学习笔记6 - 数组
查看>>