145. 二叉树后序遍历
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [3,2,1]
.
前序遍历 是根 、左 、右
我们访问根、右、左,然后把结果反转,就是 左、右、根(后续遍历)。
与前序不同,我们先一直循环访问右子树。
class Solution: def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: stack = [] cur = root res = [] while cur or stack: while cur: stack.append(cur) res.append(cur.val) cur = cur.right top = stack.pop() cur = top.left return res[::-1]
递归:
/** * 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> res; void backtrack(TreeNode* root) { if (root == nullptr) { return; } backtrack(root->left); backtrack(root->right); res.push_back(root->val); } vector<int> postorderTraversal(TreeNode* root) { backtrack(root); return res; } };
非递归一: 模板写法
前序遍历 是根 、左 、右
我们访问根、右、左,然后把结果反转,就是 左、右、根(后续遍历)。
与前序不同,我们先一直循环访问右子树。
/** * 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> postorderTraversal(TreeNode *root) { vector<int> res; stack<TreeNode*> stk; while (!stk.empty() || root != nullptr) { while(root != nullptr) { res.insert(res.begin(),root->val); stk.push(root); root = root->right; } root = stk.top(); stk.pop(); root = root->left; } return res; } };
非递归二:
class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int> res; if(root == nullptr) return res; stack<TreeNode*> stk; TreeNode* pre = nullptr; stk.push(root); while (!stk.empty()) { root = stk.top(); if (pre == nullptr || root == pre->left || root == pre->right ) { if (root->left != nullptr) { stk.push(root->left); } else if (root->right != nullptr) { stk.push(root->right); } else { res.push_back(root->val); stk.pop(); } } else if (pre == root->left) { if (root->right != nullptr) { stk.push(root->right); } else { res.push_back(root->val); stk.pop(); } } else { res.push_back(root->val); stk.pop(); } pre = root; } return res; } };
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步