没想到二叉树的后序遍历可以实现的这么简单,代码参考自:牛客网-重庆森林2.0。
先序遍历的顺序为:根->左->右,我们借助栈的思想,实现先序遍历很方便。
//先序遍历代码,教科书中的代码
void preOrder2(BinTree *root) //非递归前序遍历
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
我们也可以写成如下代码,我们可以对比一下该代码与上面代码的异同,会发现下面的代码在栈的输入输出上与二叉树先序遍历顺序相同,更容易理解。
vector<int> preorderTraversal(TreeNode *root) {
vector<int> res;
if(root == NULL) return res;
stack<TreeNode*> s;
s.push(root);
while(s.size())
{
TreeNode *p = s.top();
s.pop();
res.push_back(p->val);
if(p->right) s.push(p->right);
if(p->left) s.push(p->left);
}
return res;
}
这里我们着重介绍后序遍历,后序遍历的节点顺序为:左->右->根。
我们如果在遍历时把顺序改为:根->右->左,在颠倒(reverse)一下就能实现 左->右->根的顺序。
//后序遍历如下:
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> res;
stack<TreeNode*> s;
if(root == NULL) return res;
s.push(root);
while(s.size())
{
TreeNode *p = s.top();
res.push_back(p->val);
s.pop();
if(p->left) s.push(p->left);
if(p->right) s.push(p->right);
}
reverse(res.begin(),res.end());
return res;
}