地址 https://www.acwing.com/solution/content/21571/
给定一个二叉树,返回它的 后序 遍历。 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?
算法1
简洁的递归写法
C++ 代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) :
* val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> v; void dfs(TreeNode* root) { if (root == NULL) return; dfs(root->left); dfs(root->right); v.push_back(root->val); } vector<int> postorderTraversal(TreeNode* root) { dfs(root); return v; } };
算法2
使用栈的迭代写法
由于栈是先进后出
所以先进根节点 再进左右子节点
出栈的时候要注意 只有左右子节点都出栈了才能出栈
所以加了一个map做记录方便速查
C++ 代码
class Solution { public: map<TreeNode*, int> flag; stack< TreeNode*> st; vector<int> v; vector<int> postorderTraversal(TreeNode* root) { // memset(flag, 0, sizeof flag); if (root == NULL)return v; st.push(root); flag[root] = 1; while (st.size()) { TreeNode* p = st.top(); int noNext = 1; if (p->right != NULL && flag[p->right ] == 0) { st.push(p->right); flag[p->right ] = 1; noNext = 0; } if (p->left != NULL && flag[p->left ] == 0) { st.push(p->left); flag[p->left ] = 1; noNext = 0; } if (noNext == 1) { v.push_back(p->val); st.pop(); } } return v; } };