← Static tasks

145. Binary Tree Postorder Traversal

leetcode easy

#array#csharp#easy#leetcode#stack#tree#two-pointers

Task

Дан корень бинарного дерева, верните обход значений узлов в постпорядке.

Пример:

Input: root = [1,null,2,3]

Output: [3,2,1]

C# solution

matched/original
public 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/original
class 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/original
var 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/original
class 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/original
func 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️⃣

Повторение процесса до опустошения стека:

Если извлеченный узел не является левым листом, необходимо обработать его потомков. Для этого, верните узел и его потомков в стек в правильном порядке, чтобы следующие итерации могли корректно обработать все узлы.

Повторяйте процесс до тех пор, пока стек не опустеет, что означает завершение обхода всех узлов.

😎