Inorder for Vertical Order Traversal

 avatar
unknown
java
5 days ago
1.9 kB
0
Indexable
import java.util.*;

// TreeNode definition as before

class Tuple {
    TreeNode node;
    int vertical;
    int level;

    Tuple(TreeNode node, int vertical, int level) {
        this.node = node;
        this.vertical = vertical;
        this.level = level;
    }
}

class Solution {
    public List<List<Integer>> verticalTraversal(TreeNode root) {
        // TreeMap stores the nodes by vertical -> level -> node value
        TreeMap<Integer, TreeMap<Integer, PriorityQueue<Integer>>> map = new TreeMap<>();

        // Start the inorder traversal
        inorder(root, 0, 0, map);

        // Prepare the result list by traversing the map
        List<List<Integer>> result = new ArrayList<>();
        for (TreeMap<Integer, PriorityQueue<Integer>> verticalMap : map.values()) {
            List<Integer> verticalNodes = new ArrayList<>();
            for (PriorityQueue<Integer> nodeQueue : verticalMap.values()) {
                while (!nodeQueue.isEmpty()) {
                    verticalNodes.add(nodeQueue.poll());
                }
            }
            result.add(verticalNodes);
        }

        return result;
    }

    // Inorder traversal method
    private void inorder(TreeNode node, int vertical, int level, TreeMap<Integer, TreeMap<Integer, PriorityQueue<Integer>>> map) {
        if (node == null) {
            return;
        }

        // Traverse left
        inorder(node.left, vertical - 1, level + 1, map);

        // Visit the current node
        if (!map.containsKey(vertical)) {
            map.put(vertical, new TreeMap<>());
        }
        if (!map.get(vertical).containsKey(level)) {
            map.get(vertical).put(level, new PriorityQueue<>());
        }
        map.get(vertical).get(level).add(node.val);

        // Traverse right
        inorder(node.right, vertical + 1, level + 1, map);
    }
}
Leave a Comment