-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDfsInsertStrategy.java
More file actions
60 lines (41 loc) · 1.71 KB
/
Copy pathDfsInsertStrategy.java
File metadata and controls
60 lines (41 loc) · 1.71 KB
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
package datastructs.adt.utils;
import utils.*;
public class DfsInsertStrategy<E> implements ITreeInsertStrategy<E> {
@Override
public final TreeInsertMethod type(){return TreeInsertMethod.DFS; }
@Override
public final boolean insert(TreeNode<E> root, TreeNode<E> parent, E data, IPredicate<TreeNode<E>> insertPosPredicate){
return doInsert(root, parent, data, insertPosPredicate).first;
}
private final <DataTp> Pair<Boolean, TreeNode<DataTp>> doInsert(TreeNode<DataTp> root, TreeNode<DataTp> parent,
DataTp data, IPredicate<TreeNode<DataTp>> insertPosPredicate){
TreeNodeCreator<DataTp> creator = new TreeNodeCreator<>();
utils.Pair<Boolean, TreeNode<DataTp>> rslt = PairCreator.makePair(false, null);
if(insertPosPredicate.satisfies(root)){
if(root != null){
root.setData(data);
}
else {
if (parent == null) {
root = creator.create(data, null, -1, -1);
}
else {
root = creator.create(data, parent, parent.getLevel()+1, parent.getNChildren());
}
rslt.first = true;
rslt.second= root;
}
}
else{
for(int c = 0; c<root.getNChildren(); ++c){
rslt = doInsert(root.getChild(c), root, data, insertPosPredicate);
if(rslt != null && rslt.first && rslt.second != null){
root.setChild(c, rslt.second);
rslt.second = null;
break;
}
}
}
return rslt;
}
}