非递归实现树的后序遍历

来源:互联网 发布:百度云计算 编辑:程序博客网 时间:2024/05/30 23:21

前序遍历是通过一个stack,首先压入父亲结点,然后弹出父亲结点,并输出它的value,之后压人其右儿子,左儿子即可。然而后序遍历结点的访问顺序是:左儿子 -> 右儿子 -> 自己。那么一个结点需要两种情况下才能够输出:第一,它已经是叶子结点;第二,它不是叶子结点,但是它的儿子已经输出过。那么基于此我们只需要记录一下当前输出的结点即可。对于一个新的结点,如果它不是叶子结点,儿子也没有访问,那么就需要将它的右儿子,左儿子压入。如果它满足输出条件,则输出它,并记录下当前输出结点。输出在stack为空时结束。

class Solution {  public:      vector<int> postorderTraversal(TreeNode *root) {          // IMPORTANT: Please reset any member data you declared, as          // the same Solution instance will be reused for each test case.          vector<int> path;          if(root==NULL)return path;            stack<TreeNode*> stk;          stk.push(root);          TreeNode* cur = NULL;          while(!stk.empty())          {              cur = stk.top();              if(cur->left ==NULL && cur->right ==NULL)              {                  path.push_back(cur->val);                  stk.pop();              }else{                  if(cur->right)                  {                      stk.push(cur->right);                      cur->right = NULL;                  }                  if(cur->left)                  {                      stk.push(cur->left);                      cur->left = NULL;                  }              }          }          return path;      }  };  


0 0
原创粉丝点击