145. Binary Tree Postorder Traversal
leetcode easy
Task
Дан корень бинарного дерева, верните обход значений узлов в постпорядке.
Пример:
Input: root = [1,null,2,3]
Output: [3,2,1]
C# solution
matched/originalpublic class Solution {
public IList<int> PostorderTraversal(TreeNode root) {
List<int> output = new List<int>();
Stack<TreeNode> stack = new Stack<TreeNode>();
if (root == null)
return output;
stack.Push(root);
while (stack.Count > 0) {
root = stack.Pop();
output.Add(root.val);
if (root.left != null)
stack.Push(root.left);
if (root.right != null)
stack.Push(root.right);
}
output.Reverse();
return output;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public vector<int> PostorderTraversal(TreeNode root) {
List<int> output = new List<int>();
stack<TreeNode> stack = new stack<TreeNode>();
if (root == null)
return output;
stack.push(root);
while (stack.size() > 0) {
root = stack.pop();
output.push_back(root.val);
if (root.left != null)
stack.push(root.left);
if (root.right != null)
stack.push(root.right);
}
output.Reverse();
return output;
}
}Java solution
matched/originalclass Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> output = new LinkedList();
Deque<TreeNode> stack = new ArrayDeque();
if (root == null) return output;
stack.push(root);
while (!stack.isEmpty()) {
root = stack.pop();
output.addFirst(root.val);
if (root.left != null) stack.push(root.left);
if (root.right != null) stack.push(root.right);
}
return output;
}
}JavaScript solution
matched/originalvar postorderTraversal = function (root) {
let output = [];
let stack = [];
if (root === null) return output;
stack.push(root);
while (stack.length > 0) {
root = stack.pop();
output.push(root.val);
if (root.left !== null) stack.push(root.left);
if (root.right !== null) stack.push(root.right);
}
output.reverse();
return output;
};Python solution
matched/originalclass Solution(object):
def postorderTraversal(self, root: TreeNode) -> List[int]:
if root is None:
return []
stack, output = [
root,
], []
while stack:
root = stack.pop()
output.append(root.val)
if root.left is not None:
stack.append(root.left)
if root.right is not None:
stack.append(root.right)
return output[::-1]Go solution
matched/originalfunc postorderTraversal(root *TreeNode) []int {
var output []int
var stack []*TreeNode
if root == nil {
return output
}
stack = append(stack, root)
for len(stack) != 0 {
i := len(stack) - 1
root = stack[i]
stack = stack[:i]
output = append(output, root.Val)
if root.Left != nil {
stack = append(stack, root.Left)
}
if root.Right != nil {
stack = append(stack, root.Right)
}
}
for i := len(output)/2 - 1; i >= 0; i-- {
j := len(output) - 1 - i
output[i], output[j] = output[j], output[i]
}
return output
}Explanation
Algorithm
1️⃣
Заполнение стека по стратегии право->узел->лево:
Инициируйте стек и добавьте в него корень дерева.
Перед тем как положить узел в стек, сначала добавьте его правого потомка, затем сам узел, а после — левого потомка. Это обеспечит последовательное извлечение узлов из стека в нужном порядке для постпорядкового обхода.
2️⃣
Извлечение узла из стека и проверка:
Извлекайте последний узел из стека, проверяя, является ли он левым листом (узел без потомков).
Если это так, добавьте значение узла в выходной список (массив значений). Если узел имеет потомков, продолжайте выполнение стека с добавлением дочерних узлов по той же стратегии.
3️⃣
Повторение процесса до опустошения стека:
Если извлеченный узел не является левым листом, необходимо обработать его потомков. Для этого, верните узел и его потомков в стек в правильном порядке, чтобы следующие итерации могли корректно обработать все узлы.
Повторяйте процесс до тех пор, пока стек не опустеет, что означает завершение обхода всех узлов.
😎