本文最后更新于:2022年9月6日 晚上
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
Solution
参考 @z1m 、[94 二叉树的中序遍历]、[144 二叉树的前序遍历]、[102 二叉树的层序遍历]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Solution {public : vector <int > postorderTraversal (TreeNode* root) { vector <int > res; postorder(root, res); return res; }private : void postorder (TreeNode* root, vector <int >& res) { if (root){ postorder(root->left, res); postorder(root->right, res); res.push_back(root->val); } } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Solution {public : vector <int > postorderTraversal (TreeNode* root) { vector <int > res; stack <TreeNode*> stack ; TreeNode* node = root, *pre=nullptr ; while (node || !stack .empty()){ while (node){ stack .push(node); node = node->left; } node = stack .top(); stack .pop(); if (node->right==nullptr || node->right==pre){ res.push_back(node->val); pre = node; node = nullptr ; } else { stack .push(node); node = node->right; } } return res; } };
方案二:访问过程 “根 -> 右 -> 左”,将结果反转
本质上,这种方法是一个“前序遍历”,而不是“后序遍历”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution {public : vector <int > postorderTraversal (TreeNode* root) { vector <int > res; stack <TreeNode*> stack ; TreeNode* node = root; while (node || !stack .empty()){ while (node){ res.push_back(node->val); stack .push(node); node = node->right; } node = stack .top(); stack .pop(); node = node->left; } reverse(res.begin(), res.end()); return res; } };
java
class Solution { public List<Integer> postorderTraversal (TreeNode root) { List<Integer> result = new ArrayList<>(); postorder(root, result); return result; } private void postorder (TreeNode root, List<Integer> rec) { if (root == null ) { return ; } postorder(root.left, rec); postorder(root.right, rec); rec.add(root.val); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public List<Integer> postorderTraversal (TreeNode root) { List<Integer> result = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); TreeNode node = root; while (node != null || !stack.isEmpty()) { while (node != null ) { result.add(node.val); stack.push(node); node = node.right; } node = stack.pop(); node = node.left; } Collections.reverse(result); return result; } }