Categorías
Algorithms

Leetcode – Cruce de posorden de árbol binario (Java)

Entre los problemas de recorrido de árbol binario de preorden, inorden y postorder, el recorrido de postorder es el más complicado.

Por ejemplo, para el siguiente árbol, el recorrido de la orden de envío devuelve {4, 6, 5, 2, 3, 1}.

Solución Java 1

La clave para el recorrido iterativo del postorder es la siguiente:

  1. El orden de «Postorder» es: hijo izquierdo -> hijo derecho -> nodo padre.
  2. Encuentre la relación entre el nodo visitado anteriormente y el nodo actual
  3. Usa una pila para rastrear nodos

A medida que bajamos por el árbol hasta la izquierda, verifique el nodo visitado anteriormente. Si el nodo actual es el hijo izquierdo o derecho del nodo anterior, continúe bajando por el árbol y agregue el nodo izquierdo / derecho a la pila cuando corresponda. Cuando no hay hijos para el nodo actual, es decir, el nodo actual es una hoja, sáquelo de la pila. Luego, el nodo anterior pasa a estar debajo del nodo actual para el siguiente bucle. Puede usar un ejemplo para recorrer el código.

//Definition for binary tree
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}
 
 
public class Solution {
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
 
        ArrayList<Integer> lst = new ArrayList<Integer>();
 
        if(root == null)
            return lst; 
 
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
 
        TreeNode prev = null;
        while(!stack.empty()){
            TreeNode curr = stack.peek();
 
            // go down the tree.
            //check if current node is leaf, if so, process it and pop stack,
            //otherwise, keep going down
            if(prev == null || prev.left == curr || prev.right == curr){
                //prev == null is the situation for the root node
                if(curr.left != null){
                    stack.push(curr.left);
                }else if(curr.right != null){
                    stack.push(curr.right);
                }else{
                    stack.pop();
                    lst.add(curr.val);
                }
 
            //go up the tree from left node    
            //need to check if there is a right child
            //if yes, push it to stack
            //otherwise, process parent and pop stack
            }else if(curr.left == prev){
                if(curr.right != null){
                    stack.push(curr.right);
                }else{
                    stack.pop();
                    lst.add(curr.val);
                }
 
            //go up the tree from right node 
            //after coming back from right node, process parent node and pop stack. 
            }else if(curr.right == prev){
                stack.pop();
                lst.add(curr.val);
            }
 
            prev = curr;
        }
 
        return lst;
    }
}
  LeetCode - Ladrón de casas II (Java)

Solución Java 2 – ¡Simple!

Esta solución es simple, pero tenga en cuenta que la estructura del árbol cambia ya que los niños se establecen en nulo.

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<Integer>();
 
    if(root==null) {
        return res;
    }
 
    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(root);
 
    while(!stack.isEmpty()) {
        TreeNode temp = stack.peek();
        if(temp.left==null && temp.right==null) {
            TreeNode pop = stack.pop();
            res.add(pop.val);
        }
        else {
            if(temp.right!=null) {
                stack.push(temp.right);
                temp.right = null;
            }
 
            if(temp.left!=null) {
                stack.push(temp.left);
                temp.left = null;
            }
        }
    }
 
    return res;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *