public boolean isValidSerialization(String preorder) {
        if (preorder == null) return false;
        Stack<String> s = new Stack<String>();
        String[] tokens = preorder.split(",");
        for (String token : tokens) {
            s.push(token);
            while (s.size() >= 3 &&
                   s.get(s.size() - 1).equals("#") &&
                   s.get(s.size() - 2).equals("#") &&
                   !s.get(s.size() - 3).equals("#")) {
                s.pop(); s.pop(); s.pop();
                s.push("#");
            }
        }
        return s.size() == 1 && s.peek().equals("#");
    }