1028. Recover a Tree From Preorder Traversal

T: O(n)

S: O(n)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode recoverFromPreorder(String traversal) {
        List<int[]> list = parseTraversal(traversal);
        int[] index = new int[1];
        return dfs(list, index, 0);
    }
    /**

1-2-3

1
/
2 

 */
    private TreeNode dfs(List<int[]> list, int[] index, int level) {
        if (index[0] == list.size()) {
            return null;
        }
        int[] cur = list.get(index[0]);
        int nodeVal = cur[0];
        int nodeLevel = cur[1];
        //System.out.println("nodeVal=" + nodeVal + ",level=" + level + ",nodeLevel=" + nodeLevel);
        if (level != nodeLevel) { // for right level to add node, so if it try to add node in wrong level, will return, then backtracking
        // until it matches the correct level!
            return null;
        }
        TreeNode root = new TreeNode(nodeVal);
        index[0]++; 
        root.left = dfs(list, index, nodeLevel+1); 
        root.right = dfs(list, index, nodeLevel+1); 
        return root;
    }
    private List<int[]> parseTraversal(String s) {
        int i = 0;
        List<int[]> list = new ArrayList<>();
        int level = 0;
        while (i < s.length()) {
            if (Character.isDigit(s.charAt(i))) {
                StringBuilder sb = new StringBuilder();
                while (i < s.length() && Character.isDigit(s.charAt(i))) {
                    sb.append(s.charAt(i));
                    i++;
                }
                list.add(new int[] {Integer.parseInt(sb.toString()), level});
            } else {
                level = 0;
                while (i < s.length() && !Character.isDigit(s.charAt(i))) {
                    level++;
                    i++;
                }
            }
        }
        return list;
    }
}

/***
for ex:
traversal =
"1-2-3"

should be 


new ex: (see this)
"1-2--3-4"
nodeVal=1,level=0,nodeLevel=0
nodeVal=2,level=1,nodeLevel=1
nodeVal=3,level=2,nodeLevel=2
nodeVal=4,level=3,nodeLevel=1 -> this is level != nodeLevel so return null, back to previous level, index[0] keeps the same
nodeVal=4,level=3,nodeLevel=1 -> this is level != nodeLevel so return null, back to previous level, index[0] keeps the same
nodeVal=4,level=2,nodeLevel=1 -> this is level != nodeLevel so return null, back to previous level, index[0] keeps the same
nodeVal=4,level=1,nodeLevel=1 -> finally it gets the correct level! so connect this node! (and because index[0] is the same, so we'll try to keep using it!)

 1 level = nodeLevel = 0
 /
 2 level = nodeLevel = 1    4 (add here)
/
3. level = nodeLevel = 2, 
/
level = 3
then try level + 1 -> try nodeVal=4,level=3,nodeLevel=1 -> x back to previous level
level = 2 -> x back to previous level
nodeVal=4,level=1,nodeLevel = 1 -> correct!

like these:
nodeVal=4,level=3,nodeLevel=1 -> this is level != nodeLevel so return null, back to previous level, index[0] keeps the same
nodeVal=4,level=3,nodeLevel=1 -> this is level != nodeLevel so return null, back to previous level, index[0] keeps the same
nodeVal=4,level=2,nodeLevel=1 -> this is level != nodeLevel so return null, back to previous level, index[0] keeps the same
nodeVal=4,level=1,nodeLevel=1 -> finally it gets the correct level! so connect this node! (and because index[0] is the same, so we'll try to

        int[] cur = list.get(index[0]);
        int nodeVal = cur[0];
        int nodeLevel = cur[1];
        //System.out.println("nodeVal=" + nodeVal + ",level=" + level + ",nodeLevel=" + nodeLevel);
        if (level != nodeLevel) { // for right level to add node, so if it try to add node in wrong level, will return, then backtracking
        // until it matches the correct level!
            return null;
        }
        TreeNode root = new TreeNode(nodeVal);
        index[0]++; 
        root.left = dfs(list, index, nodeLevel+1); 
        root.right = dfs(list, index, nodeLevel+1); 


T: O(n + list size)
S: O(list size)
 */

Last updated

Was this helpful?