有一棵樹,需將某子樹完整複製到另一節點作為子節點,原樹保持不變,新節點數據獨立。
public class TreeNode {
String data;
List<TreeNode> children = new ArrayList<>();
// 深拷貝構造函數
public TreeNode(TreeNode source) {
this.data = source.data; // String 不可變,直接賦值
for (TreeNode child : source.children) {
this.children.add(new TreeNode(child)); // 遞歸深拷貝
}
}
// 靜態工廠方法
public static TreeNode deepCopy(TreeNode root) {
return root == null ? null : new TreeNode(root);
}
}
public void copySubtreeTo(TreeNode sourceSubtreeRoot, TreeNode targetParent) {
if (sourceSubtreeRoot == null || targetParent == null) return;
TreeNode newSubtree = TreeNode.deepCopy(sourceSubtreeRoot);
targetParent.children.add(newSubtree);
}
public class TreeNode {
private MutableData data; // 可變對象
List<TreeNode> children = new ArrayList<>();
public TreeNode(TreeNode source) {
this.data = source.data.deepCopy(); // 必須深拷貝數據對象
for (TreeNode child : source.children) {
this.children.add(new TreeNode(child));
}
}
}
雖可實現 clone(),但:
Cloneable 並處理 CloneNotSupportedExceptionTreeNode root = new TreeNode("A");
root.children.add(new TreeNode("B"));
root.children.add(new TreeNode("C"));
root.children.get(0).children.add(new TreeNode("D"));
TreeNode newParent = new TreeNode("X");
copySubtreeTo(root.children.get(0), newParent); // 複製 B 及其子樹到 X 下
// 驗證獨立性
newParent.children.get(0).data = "B_copy";
assert !root.children.get(0).data.equals("B_copy"); // 原樹未變