二叉树的遍历(3):后序遍历

来源:互联网 发布:软件无响应怎么办 编辑:程序博客网 时间:2024/06/06 12:22
#include <iostream>#include <stack>#include <queue>using namespace std;typedef int TreeNodeElem;struct TreeNode {    TreeNode* left;    TreeNode* right;    TreeNodeElem elem;};//递归遍历void postOrder_R(TreeNode* root, int(*visit)(TreeNode*)){    if (root == nullptr)    {        return;    }       postOrder_R(root->left, visit);    postOrder_R(root->right, visit);    visit(root);}//非递归遍历void postOrder(TreeNode* root, int(*visit)(TreeNode*)){    TreeNode* p = root; //当前正在访问的节点    TreeNode* q;    //刚刚被访问过的节点    stack<TreeNode*> s;    do     {        while (p != nullptr)        {            s.push(p);            p = p->left;        }        q = nullptr;        while (!s.empty())        {            p = s.top();            s.pop();            if (p->right == q)  //如果右孩子被访问过,或者右孩子为空,就访问            {                visit(p);                q = p;            }            else    //右孩子不为空,而且还没有访问,必须先处理右子树            {                s.push(p);                p = p->right;                break;            }        }    } while (!s.empty());}

0 0