-
-
Notifications
You must be signed in to change notification settings - Fork 609
/
Copy pathBSTSequences.java
83 lines (72 loc) · 2.63 KB
/
BSTSequences.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package problems.medium;
import problems.utils.TreeNode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* Created by sherxon on 5/2/17.
*/
/**
* Problem:
* BST Sequences: A binary search tree was created by traversing through an array from left to right
* and inserting each element. Given a binary search tree with distinct elements, print all possible
* arrays that could have led to this tree
* */
public class BSTSequences {
/**
* Solution is simple. Do level order traversal in binary search tree, and for each level nodes get all
* possible permutations to make new lists
*
* */
static List<List<Integer>> getSequences(TreeNode root){
List<List<Integer>> lists= new ArrayList<>();
if(root==null)return lists;
List<Integer> list=new ArrayList<>();
list.add(root.val);
lists.add(list);
Queue<TreeNode> levelNodes= new LinkedList<>();
levelNodes.add(root);
int level=1;
while (!levelNodes.isEmpty()){
TreeNode node=levelNodes.remove();
level--;
if(node.left!=null)levelNodes.add(node.left);
if(node.right!=null)levelNodes.add(node.right);
if(level==0 && !levelNodes.isEmpty()){
List<List<Integer>> perms=new ArrayList<>();
getPermutations(new ArrayList<>(levelNodes), perms, 0);
List<List<Integer>> lists2=new ArrayList<>();
for (List<Integer> integers : lists) {
for (List<Integer> perm : perms) {
List<Integer> newLevel= new ArrayList<>();
newLevel.addAll(integers);
newLevel.addAll(perm);
lists2.add(newLevel);
}
}
lists=lists2;
}
}
return lists;
}
private static void getPermutations(List<TreeNode> levelNodes, List<List<Integer>> lists, int k) {
if(k==levelNodes.size()){
List<Integer> list= new ArrayList<>();
for (TreeNode levelNode : levelNodes) {
list.add(levelNode.val);
}
lists.add(list);
return;
}
for (int i = k; i <levelNodes.size(); i++) {
TreeNode temp=levelNodes.get(i);
levelNodes.set(i, levelNodes.get(k));
levelNodes.set(k, temp);
getPermutations(levelNodes, lists, k + 1);
temp=levelNodes.get(i);
levelNodes.set(i, levelNodes.get(k));
levelNodes.set(k, temp);
}
}
}