Skip to content

Commit

Permalink
Деревья
Browse files Browse the repository at this point in the history
  • Loading branch information
Pastor committed Dec 6, 2024
1 parent d545588 commit 8e1d02c
Show file tree
Hide file tree
Showing 12 changed files with 172 additions and 12 deletions.
71 changes: 71 additions & 0 deletions vol6/src/main/java/ru/mifi/practice/vol6/tree/Center.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package ru.mifi.practice.vol6.tree;

import ru.mifi.practice.vol6.tree.visitors.Count;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;

/**
* Почему реализация не правильная?
* @param <T> тип значения в вершине дерева
*/
public final class Center<T> {
public List<Node<T>> center(Tree<T> tree, Function<? super T, ? extends T> copyFunction) {
tree = tree.copy(copyFunction);
List<Node<T>> result = new ArrayList<>();
Set<Node<T>> leafs = new HashSet<>();
VisitorStrategy.PreOrder<T> strategy = new VisitorStrategy.PreOrder<>();
Visitor<T> search = new Visitor<>() {
@Override
public void enterNode(Node<T> node) {
if (node.left() == null && node.right() == null) {
leafs.add(node);
}
}

@Override
public void exitNode(Node<T> node) {
//None
}

@Override
public void empty() {
//None
}
};
Count<T> count = new Count<>();
while (true) {
count.clear();
tree.visit(count, strategy);
if (count.count() <= 2) {
break;
}
leafs.clear();
tree.visit(search, strategy);
for (Node<T> leaf : leafs) {
tree.delete(leaf.value());
}
}
tree.visit(new Visitor<T>() {

@Override
public void enterNode(Node<T> node) {
result.add(node);
}

@Override
public void exitNode(Node<T> node) {
//None
}

@Override
public void empty() {
//None
}
}, strategy);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public List<Node<T>> path(Tree<T> tree) {
}
if (maxNode != null) {
VisitorStrategy.AlreadyVisited<T> alreadyVisited = new VisitorStrategy.AlreadyVisited<>(strategy);
Node<T> start = maxNode;
final Node<T> start = maxNode;
Node<T> it = maxNode;
int distance = 0;
vDistance.clear();
Expand Down
5 changes: 4 additions & 1 deletion vol6/src/main/java/ru/mifi/practice/vol6/tree/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public static void main(String[] args) throws IOException {
System.out.print("EULER: ");
tree.visit(euler, new VisitorStrategy.PreOrder<>());
System.out.println(euler);
System.out.println(tree);
Center<Integer> center = new Center<>();
List<Node<Integer>> centered = center.center(tree, integer -> integer);
System.out.print("CENTR: ");
System.out.println(centered);
}
}
8 changes: 5 additions & 3 deletions vol6/src/main/java/ru/mifi/practice/vol6/tree/Node.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public List<Node<T>> path(T element) {
Node<T> it = search(element);
while (it != null) {
path.push(it);
if (it == this) {
if (it.equals(this)) {
break;
}
it = it.parent();
Expand All @@ -100,7 +100,8 @@ public Node<T> left() {
@Override
public Node<T> left(T value) {
if (value == null) {
return left;
left = null;
return null;
}
return left = new Default<>(this, value);
}
Expand All @@ -113,7 +114,8 @@ public Node<T> right() {
@Override
public Node<T> right(T value) {
if (value == null) {
return right;
right = null;
return null;
}
return right = new Default<>(this, value);
}
Expand Down
50 changes: 50 additions & 0 deletions vol6/src/main/java/ru/mifi/practice/vol6/tree/Tree.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public interface Tree<T> extends Visitor.Visit<T> {
@Override
void visit(Visitor<T> visitor, VisitorStrategy<T> strategy);

void delete(T value);

Tree<T> copy(Function<? super T, ? extends T> copyFunction);

interface Loader<T> {
Tree<T> parse(InputStream stream, Function<String, T> value, Comparator<T> comparator) throws IOException;
}
Expand Down Expand Up @@ -75,5 +79,51 @@ public Node<T> find(T element) {
}
return root.search(element);
}

@SuppressWarnings("PMD.EmptyControlStatement")
@Override
public void delete(T value) {
Node<T> node = find(value);
if (node == null) {
//None
} else if (node.parent() != null) {
var parent = node.parent();
if (parent.left() != null && parent.left().value().equals(value)) {
parent.left(null);
} else if (parent.right() != null && parent.right().value().equals(value)) {
parent.right(null);
}
}
}

@Override
public Tree<T> copy(Function<? super T, ? extends T> copyFunction) {
Standard<T> tree = new Standard<>(comparator);
this.visit(new Visitor<T>() {
@Override
public void enterNode(Node<T> node) {
Node<T> find = tree.find(node.value());
T left = node.left() == null ? null : copyFunction.apply(node.left().value());
T right = node.right() == null ? null : copyFunction.apply(node.right().value());
if (find == null) {
tree.add(node.value(), left, right);
} else {
find.left(left);
find.right(right);
}
}

@Override
public void exitNode(Node<T> node) {
//None
}

@Override
public void empty() {
//None
}
}, new VisitorStrategy.PreOrder<>());
return tree;
}
}
}
3 changes: 2 additions & 1 deletion vol6/src/main/java/ru/mifi/practice/vol6/tree/Visitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

public interface Visitor<T> {
void enterNode(Node<T> node);

void exitNode(Node<T> node);

void empty();
Expand All @@ -20,7 +21,7 @@ public void enterNode(Node<T> node) {

@Override
public void exitNode(Node<T> node) {

//None
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public void visit(Node<T> node, Visitor<T> visitor, VisitorStrategy<T> strategy)
}
visited.add(node);
visitor.enterNode(node);
strategy.visit(node.left(), visitor, strategy);
strategy.visit(node.right(), visitor, strategy);
this.strategy.visit(node.left(), visitor, strategy);
this.strategy.visit(node.right(), visitor, strategy);
visitor.exitNode(node);
}
}
Expand Down
33 changes: 33 additions & 0 deletions vol6/src/main/java/ru/mifi/practice/vol6/tree/visitors/Count.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ru.mifi.practice.vol6.tree.visitors;

import ru.mifi.practice.vol6.tree.Node;
import ru.mifi.practice.vol6.tree.Visitor;

import java.util.concurrent.atomic.AtomicInteger;

public final class Count<T> implements Visitor<T> {
private final AtomicInteger count = new AtomicInteger(0);

public void clear() {
count.set(0);
}

public int count() {
return count.get();
}

@Override
public void enterNode(Node<T> node) {
count.incrementAndGet();
}

@Override
public void exitNode(Node<T> node) {
//None
}

@Override
public void empty() {
//None
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ public void exitNode(Node<T> node) {

@Override
public void empty() {

//None
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public List<Node<T>> path() {

@Override
public void empty() {

//None
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public List<Node<T>> times() {

@Override
public void empty() {

//None
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ public void exitNode(Node<T> node) {

@Override
public void empty() {

//None
}
}

0 comments on commit 8e1d02c

Please sign in to comment.