二叉树非递归遍历

发布时间:2024-12-05 02:59

腻子两遍以上,第一遍打底,第二遍找平 #生活常识# #家庭维修技巧# #墙面刮腻子#

二叉树非递归遍历

最新推荐文章于 2024-10-10 15:26:55 发布

Maxwell__726 于 2017-06-18 19:15:40 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

二叉树的遍历方式:先序,中序,后序;递归方式遍历很简单,今天谈谈非递归方式遍历;

先序遍历:

/* 先序遍历的非递归思想:借助一个栈来保存遍历的序列,以此来访问右子节点 */ #include <stack> struct TreeNode{ int val; TreeNode * left; TreeNode * right; }; void preorderTravelsal(TreeNode* root){ if(!root)return;//边界条件判断,如果树空 stack<TreeNode*>sta; while(root || !sta.empty()){ while(root){ cout<<root->val<<endl; sta.push(root); root=root->left; } if(!sta.empty()){ root=sta.top(); sta.pop(); root=root->right; } } }

12345678910111213141516171819202122232425

中序遍历

/* 思想中序遍历的非递归形式和先序遍历基本一样,只是输出的顺序不一样,中序遍历先输出左节点,在输出根,最后输出右节点; */ #include <stack> struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; void inorderTravelsal(TreeNode* root){ if(!root)return; stack<TreeNode*>sta; while(root || !sta.empty()){ while(root){ sta.push(root); root=root->left; } if(!sta.empty()){ root=sta.top(); cout<<root->val<<endl; sta.pop(); root=root->right; } } }

12345678910111213141516171819202122232425

后序遍历

/* 思路:后序遍历稍微复杂点,它必须记录是否结点的左右子节点都访问完,才能访问根节点 */ #include <stack> struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; void postorderTravelsal(TreeNode* root){ if(!root)return; stack<TreeNode*>sta; TreeNode curr=root;//当前节点 TreeNode pre=NULL;//刚刚访问的节点 while(curr||!sta.empty()){ while(curr){ sta.push(curr) curr=curr->left; } curr=sta.top();//栈首元素,最左元素 //只有当最左节点的右子节点为空或者访问过了,才能访问该节点 if(curr->right==NULL || curr->right==pre){ cout<<curr->val<<endl; pre=curr; sta.pop(); curr=NULL; } else curr=curr->right; } }

123456789101112131415161718192021222324252627282930

网址:二叉树非递归遍历 https://www.yuejiaxmz.com/news/view/379409

相关内容

题解:二叉树问题
java 递归遍历树形结构
最优二叉检索树
数据结构学习笔记之树和森林的存储结构与相关应用
递归思想——关于递归的多个例子详解
工作与家庭冲突:压力的交叉传递效应(理论进展)
Python中递归阶乘
【前端】Object.keys()的使用方法及数组遍历,Object.keys(object).forEach(e => {您的代码})
中国剪纸:最具普遍性和文化多样性的非遗
阿里本地生活一二三面

随便看看