@Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    DataNode node = (DataNode)o;

    if (!Objects.equals(key, node.key)) return false;
    if (!Objects.equals(getData(), node.getData())) return false;
    if (!Objects.equals(ObjectUtils.notNull(children, Collections.emptyList()),
                        ObjectUtils.notNull(node.children, Collections.emptyList()))) {
      return false;
    }
    return true;
  }
@Override
  public boolean equals(Object o)