// Copyright 2014 Thomas Müller
// This file is part of HMMLA, which is licensed under GPLv3.
package hmmla.hmm;
import java.io.Serializable;
import java.util.List;
public class Tree implements Serializable {
private static final long serialVersionUID = 1364049301082188023L;
private String name_;
private Tree left_;
private Tree right_;
private Tree parent_;
private int level_;
public Tree(String name, int level) {
this.name_ = name;
level_ = level;
}
public void setParent(Tree parent) {
this.parent_ = parent;
}
public Tree setLeft(String name) {
left_ = new Tree(name, level_ + 1);
left_.setParent(this);
return left_;
}
public Tree setRight(String name) {
right_ = new Tree(name, level_ + 1);
right_.setParent(this);
return right_;
}
public boolean isLeaf() {
if (left_ == null && right_ == null) {
return true;
}
return false;
}
public void getLeaves(List<Tree> leaves) {
if (isLeaf()) {
leaves.add(this);
} else {
assert left_ != null && right_ != null;
left_.getLeaves(leaves);
right_.getLeaves(leaves);
}
}
public void getTreesOverLeaves(List<Tree> descendants) {
if (!isLeaf()) {
assert left_ != null && right_ != null;
if (left_.isLeaf() && right_.isLeaf()) {
descendants.add(this);
} else {
left_.getTreesOverLeaves(descendants);
right_.getTreesOverLeaves(descendants);
}
}
}
public String getName() {
return name_;
}
public String toString() {
return String.format("(%s %d %s %s)", getName(), level_,
(left_ != null) ? left_.toString() : "_",
(right_ != null) ? right_.toString() : "_");
}
public Tree getRight() {
return right_;
}
public Tree getLeft() {
return left_;
}
public Tree getParent() {
return parent_;
}
public void prune() {
if (!isLeaf()) {
assert right_ != null && left_ != null;
right_.parent_ = null;
left_.parent_ = null;
left_ = null;
right_ = null;
level_ += 1;
}
}
public Tree getRoot() {
if (parent_ == null) {
return this;
} else {
return parent_.getRoot();
}
}
public void incrementLevel() {
level_ += 1;
}
public int getLevel() {
return level_;
}
public void getChildrenWithLevel(List<Tree> trees, int level) {
if (isLeaf() || level_ >= level) {
trees.add(this);
} else {
left_.getChildrenWithLevel(trees, level);
right_.getChildrenWithLevel(trees, level);
}
}
}