- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第
C++实现二叉树非递归遍历算法详解
目录一、二叉树的前序遍历二、二叉树的中序遍历三、二叉树的后序遍历3.1方法一3.2方法二
一、二叉树的前序遍历
题目链接
我们可以把任何一棵树看成左路节点,左路节点和右子树。先访问左路节点,再访问左路节点的右子树。在右子树中也重复这种循环,就是非递归遍历二叉树的思想。
解释:
栈st存放节点,v存放数值,cur初始化为root。
循环条件是栈不为空或者cur不为空(访问最后一个节点之前栈就已经为空了),循环遍历左子树并且把左子树入栈,同时把值存入v中。然后弹出栈顶元素,并且把栈顶元素的右子树赋值给cur,这样就形成了遍历。
当栈不为空的时候说明还有左路节点的右子树没有被访问,当cur不为空的时候说明还有树要被访问。当同时为空的时候才是访问完成。当一个节点出栈的时候说明此时该节点及该节点的左子树已经被访问完成了。
classSolution{
public:
vectorintpreorderTraversal(TreeNode*root){
stackTreeNode*
vectorint
TreeNode*cur=root;
while(cur||!st.empty())
while(cur)
st.push(cur);
v.push_back(cur-val);
cur=cur-left;
TreeNode*node=st.top();
st.pop();
cur=node-right;//转化成子问题访问右子树
returnv;
二、二叉树的中序遍历
题目链接
因为中序遍历的访问顺序是左根右,跟前序遍历不同,所以我们让左节点入栈的时候先不访问,出栈(说明左子树访问完了)时在访问节点。
classSolution{
public:
vectorintinorderTraversal(TreeNode*root){
vectorint
stackTreeNode*
TreeNode*cur=root;
while(!st.empty()||cur)
while(cur)
st.push(cur);
cur=cur-left;
TreeNode*node=st.top();
st.pop();
v.push_back(node-val);
cur=node-right;
returnv;
三、二叉树的后序遍历
3.1方法一
首先我们知道后序遍历就是左右根,而我们可以把访问顺序变成根右左,然后再逆置顺序。而根右左就跟前序遍历的方法一样:
classSolution{
public:
vectorintpostorderTraversal(TreeNode*root){
stackTreeNode*
vectorint
TreeNode*cur=root;
while(cur||!st.empty())
while(cur)
st.push(cur);
v.push_back(cur-val);
cur=cur-right;
TreeNode*node=st.top();
st.pop();
cur=node-left;
reverse(v.begin(),v.end());
returnv;
3.2方法二
按照常规的遍历方法走左右根,但是这里有一个问题:
当访问到根的时候有两种情况:
1??从左子树回来,现在要先访问右子树
2??从右子树回来,左右子树已经访问完毕,再访问根。
针对这种情况我们可以在加一个变量来确定是第几次访问根,如果是第一次就访问右子树,如果是第二次就访问。
classSolution{
public:
vectorintpostorderTraversal(TreeNode*root){
stackpairTreeNode*,boolst;
vectorint
TreeNode*cur=root;
while(cur||!st.empty())
while(cur)
st.push(make_pair(cur,false));
文档评论(0)