LeetCode 145 二叉树的后序遍历(非递归)
题目:
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解题思路:
1、使用一个栈,先把二叉树的右孩子压入,再把左孩子压入。这样在输出时就满足后序要求(先左后右)。
2、当某个节点的左孩子或者右孩子都为NULL时,可以访问。此外记录当前节点p的上一个节点last,因为当p的左右孩子都已访问过时,轮到p被访问,设置last可标志p的左右孩子是否都被访问过了。即为 if((p->right == NULL && p->left == last) || p->right == last)
代码:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> postorderTraversal(TreeNode* root) { 13 vector<int> ans; 14 if(root == NULL) 15 return ans; 16 TreeNode* p = root; 17 TreeNode* last; 18 stack<TreeNode*> s; 19 s.push(p); 20 while(!s.empty()) 21 { 22 p = s.top(); 23 if((p->left == NULL && p->right == NULL) || (p->right == NULL && p->left == last) || p->right == last) 24 { 25 ans.push_back(p->val); 26 last = p; 27 s.pop(); 28 } 29 else 30 { 31 if(p->right) 32 s.push(p->right); 33 if(p->left) 34 s.push(p->left); 35 } 36 } 37 return ans; 38 } 39 };