Немедленное мысль (грубый псевдокод вперед):
class Tree {
//stuff in the tree with a root node, etc...
copyTree(Node parentTreeNode, Node copyTreeNode) {
if(copyTreeNode == null)
return;
parentTreeNode = clone(copyTreeNode) //clone just copies the node's values into the node.
if(copyTreeNode.leftChild != null) {
parentTreeNode.leftChild = new Node();
copyTree(parentTreeNode.leftChild, copyTreeNode.leftChild);
}
if(copyTreeNode.rightChild != null) {
parentTreeNode.rightChild = new Node();
copyTree(parentTreeNode.rightChild, copyTreeNode.rightChild);
}
}
}
И вы бы просто назвать это с двух корневых узлов и пусть рекурсию и строит дерево для вас.
Итак, если базовый случай активирован (текущий узел равен нулю), вы пропустите этот узел, вернувшись и перейдя в процессе рекурсии (базовый регистр важен в рекурсивных методах, иначе вы получите бесконечную рекурсию). Итак, мы начинаем с корневого узла, копируем его (если это не пусто), а затем переходим к левому поддереву, считая его также не равным нулю. Мы останавливаемся в этом методе, вызываем метод в поддереве, который «останавливается» там и вызывает слева. Когда он возвращается назад, все места, которые он «приостановил», возобновляет, переходя к правильному ребенку на каждом из этих узлов с той же процедурой. Как только левое поддерево повторяется само по себе, мы возобновляем в верхнем узле и переходим в правое поддерево, чтобы делать то же самое (как и во всех дочерних узлах, рекурсивно). Когда все будет сделано, оно просто возвращается нормально.
Рекурсия не особенно сложна, но сначала нужно понять, что нужно понимать.
Это грубая идея и не была проверена, но это примерно то, как я это сделал. Вероятно, стоит отметить, что этот стиль обработки не гарантирует, что деревья одинаковы, если в главном дереве уже есть данные, или вы передали узел, отличный от корневого узла. Но это будет то же самое ниже этого узла.
Ну, этот вопрос не объясняет большую часть проблемы. Единственный намек, который я мог бы дать, заключался бы в том, что если вы не можете обработать результат через возврат, вам придется изменить уже заданную структуру и передать ее методу через параметры. – Paul
Я думаю, вы можете посмотреть на это: http://stackoverflow.com/questions/5372512/java-binary-search-tree-recursive-copy-tree?rq=1 – Tim