【发布时间】:2019-11-13 13:49:48
【问题描述】:
我想将一棵树与另一棵树合并,t。如果有重叠的数据,我想把它们加在一起。这是我现在的代码。我不明白如何仅使用参数 t 来执行此合并功能。合并不是通常有两个参数吗?
public class TreeFunctions {
private TreeNode root;
public TreeFunctions(TreeNode root) {
this.root = root;
}
public TreeNode merge(TreeNode t) {
TreeNode curr = this.root;
if (curr == null) {
return t;
}
if (t == null) {
return curr;
}
curr.data += t.data;
curr.left = merge(t.left);
curr.right = merge(t.right);
return curr;
}
}
public class TreeNode{
TreeNode left;
TreeNode right;
int data;
public TreeNode(int data) {
this.data = data;
}
public TreeNode(int data, TreeNode left, TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
public static String inOrder(TreeNode a) {
if(a == null) return "";
else return inOrder(a.left).trim() + " " + a.data + " " + inOrder(a.right).trim();
}
}
编辑 我的合并测试:
public void testMerge2() {
TreeFunctions c = new TreeFunctions(new TreeNode(5, new TreeNode(2), null));
TreeNode d = new TreeNode(2, new TreeNode(2), new TreeNode(1));
TreeNode res2 = c.merge(d);
assertEquals(TreeNode.inOrder(res2).trim(), "4 7 1");
}
public void testMerge3() {
TreeFunctions c = new TreeFunctions(new TreeNode(5, new TreeNode(2), null));
TreeNode res2 = c.merge(null);
assertEquals(TreeNode.inOrder(res2).trim(), "2 5");
}
public void testMerge4() {
TreeFunctions c = new TreeFunctions(new TreeNode(1, new TreeNode(2, new TreeNode(5), null), null));
TreeNode res2 = c.merge(new TreeNode(1, null, new TreeNode(2, null, new TreeNode(5))));
assertEquals(TreeNode.inOrder(res2).trim(), "5 2 2 2 5");
}
【问题讨论】:
-
好吧,您找到的这段代码从 Node 对象 (1) 调用方法,目标 Node 对象 (2) 作为参数给出。就像这样:node1.merge(node2); node1 和 node2 是您正在谈论的两个输入。由于合并是一个递归函数,它从目标节点对象(2)一直向下,但它停留在调用者节点对象(1)上,因此它将所有数据收集/合并到调用者节点对象的数据上,一直到从目标节点对象 (2) 开始的树路径的底部。确保这是您想要的。
-
@AntiqTech 是的,这就是我想要的。如果我有两棵树,a 和 b,我希望在调用 a.merge(b) 时将 b 的数据复制到 a 的数据。但是,由于某种原因,我的代码无法正常工作,我得到了
StackOverflowError -
你能分享 StackOverflowError 的堆栈跟踪吗?
-
@ashpcj24 左/右链接可能存在问题。递归被调用,直到它到达一个结束节点。也是对我之前所说的更正:数据是在调用者的 root.data => this.root.data 上收集的。我不明白这部分。 this.root 是调用者节点的父节点还是树的根节点?无论如何。如果你得到stackoverflow那么你错过了停止条件=> 1:this.root为null 2:给定的目标节点为null。
标签: java merge tree binary binary-tree