java - 比较两棵树的等于方法
问题描述
我最近一直在学习java。我创造了两棵树。我需要编写代码(等于方法)来比较两棵树,如果它们相同,则输出真或假。
我的代码:
public class TreePrint {
public static void main(String[] args) {
Tree<String> rootFolder = new Tree<>("RootFolder");
Node<String> video = rootFolder.addChild("Video");
Node<String> music = rootFolder.addChild("Music");
Node<String> picture = rootFolder.addChild("Picture");
video.addChild("Terminator");
video.addChild("Die Hard");
video.addChild("Rocky");
music.addChild("Eminem");
Node<String> picture01 = picture.addChild("Picasso");
picture01.addChild("Do Vinci");
Node<String> picture02 = picture01.addChild("Adil");
picture02.addChild("Cartoon");
picture02.addChild("Comics");
Tree2<String> rootFolder1 = new Tree2<>("RootFolder1");
Node<String> video1 = rootFolder1.addChild("Video");
Node<String> music1 = rootFolder1.addChild("Music");
Node<String> picture1 = rootFolder1.addChild("Picture");
video1.addChild("Terminator");
video1.addChild("Die Hard");
video1.addChild("Rocky");
music1.addChild("Eminem");
Node<String> picture001 = picture1.addChild("Picasso");
picture001.addChild("Do Vinci");
Node<String> picture002 = picture001.addChild("Adil");
picture002.addChild("Cartoon");
picture002.addChild("Comics");
printTree(rootFolder);
printTree(rootFolder1);
boolean b1 = rootFolder.contains("P0");
System.out.println(b1);
boolean b2 = rootFolder1.contains("Eminem");
System.out.println(b2);
}
private static <T> void printTree(Node<T> node) {
printTree(node, 0);
}
private static <T> void printTree(Node<T> node, int level) {
printNode(node, level);
if (node.getChildren() != null) {
for (Node childNode : node.getChildren()) {
printTree(childNode, level + 1);
}
}
}
private static <T> void printNode(Node<T> kid, int level) {
for (int i = 0; i < level; i++) {
System.out.print(" ");
}
System.out.println(kid.getData());
}
}
第一棵树:
public class Tree<T> extends Node<T> {
public Tree(T data) {
super(data, null);
}
public boolean contains(T value) {
return recurse(iterate(), value);
}
private boolean recurse(List<Node<T>> children, T value) {
return children.stream()
.anyMatch(item -> item.getData().equals(value) || item.iterate().size() > 0 && recurse(item.iterate(), value));
}
}
public class Node<T> {
private T data;
private final List<Node<T>> children = new ArrayList<>();
private final Node<T> parent;
public Node(T data, Node<T> parent) {
this.data = data;
this.parent = parent;
}
public void addChild(Node<T> node) {
children.add(node);
}
public Node<T> addChild(T nodeData) {
Node<T> newNode = new Node<T>( nodeData, this );
children.add( newNode );
return newNode;
}
public List<Node<T>> iterate() {
return children;
}
public void remove(Node<T> node) {
children.remove(node);
}
public List<Node<T>> getChildren() {
return children;
}
public Node getParent() {
return parent;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
第二棵树:
public class Tree2<T> extends Node<T> {
public Tree2(T data) {
super(data, null);
}
public boolean contains(T value) {
return recurse(iterate(), value);
}
private boolean recurse(List<Node<T>> children, T value) {
return children.stream()
.anyMatch(item -> item.getData().equals(value) || item.iterate().size() > 0 && recurse(item.iterate(), value));
}
}
解决方案
将以下方法添加到您的 Node 类。由于您的树也是一个节点 - 您应该能够比较两棵树。仅供参考,这是由 Eclipse 自动生成的。
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (children == null) {
if (other.children != null)
return false;
} else if (!children.equals(other.children))
return false;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
return true;
}
推荐阅读
- dart - 任何想法如何在大小溢出某些值时创建自动剪切文件?
- ios - SwiftUI 拖动手势而不更新子视图
- android - Android虚拟设备在linux机器上不工作
- java - Apache Flink,任务槽数与 env.setParallelism
- react-redux - Hyperledger Explorer:如何从客户端调用 API?
- java - 用于在 Jenkins 中重置密码的 REST API
- maven - 如何将 maven 项目导出为 RAR 或 ZIP?
- python - tabula python:获取 subprocess.CalledProcessError:命令'['java','-Dfile.encoding=UTF8',错误
- sql-server - 如何修复 sqlpackage 无法将 bacpac 文件恢复到 Linux 而不是 Windows
- python - 大文件上的Python多行正则表达式而不缓冲整个文件