三种遍历的思路都是从跟开始遍历,将树分为根和左数,用栈存起来,根据栈的特性,改变访问根的时机
前序:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> ret;
stack<TreeNode*>st;
TreeNode*cur=root;
while(cur||!st.empty())
{
while(cur)
{
ret.push_back(cur->val);
st.push(cur);
cur=cur->left;
}
TreeNode*top=st.top();
cur=top->right;
st.pop();
}
return ret;
}
};
中序:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> ret;
stack<TreeNode*>st;
TreeNode*cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
TreeNode*top=st.top();
ret.push_back(top->val);
cur=top->right;
st.pop();
}
return ret;
}
};
后序:
(后序要麻烦一些,因为根是最后一个被记录,所以需要记录右数是否被记录)
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> ret;
stack<TreeNode*>st;
TreeNode*LastNode=nullptr;
TreeNode*cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
TreeNode*top=st.top();
if(top->right==nullptr||LastNode==top->right)
{
ret.push_back(top->val);
LastNode=top;
st.pop();
}
else
{
cur=top->right;
}
}
return ret;
}
};
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 二叉树的前中后序遍历 C++ 非递归
发表评论 取消回复