【问题标题】:Copying a Binary Tree in Java using a preorder traversal使用前序遍历在 Java 中复制二叉树
【发布时间】:2016-03-04 02:12:46
【问题描述】:

我正在尝试使用前序遍历来复制二叉树,但我被卡住了。 由于我没有将任何值放入新树中,因此它们显然没有正确复制...

public class Node{

int key;
String name;

Node leftChild;
Node rightChild;

Node(int key, String name){
    this.key = key;
    this.name = name;

}



public class BinaryTree{

public Node root;

public void copyTree(Node focusNode){

    if(focusNode != null){

        Node copyNode = new Node(focusNode.key, focusNode.name);

        //System.out.println(copyNode);

        copyTree(focusNode.leftChild);
        copyTree(focusNode.rightChild);
    }
}

}

【问题讨论】:

  • 你所做的对我来说看起来不错。那么问题到底出在哪里?
  • 你的问题是什么?什么没有按您的预期工作?根据您的 copyTree 方法,您似乎正在创建一个本地副本(在方法内),但由于该副本仅存在于方法内,因此它将超出范围(并有资格进行垃圾收集) copyTree 方法返回。也许你想把copyTree的签名改成返回copyNode(而不是当前的void返回值),这样你正在构造的副本就被返回了?
  • 感谢您的回复,我实际上并没有将它们复制到新的“复制”树中,这就是我想要的,但您的回复仍然为我清除了一些东西..

标签: java copy binary-tree preorder


【解决方案1】:

这是一种解决方案。我在Node 类中添加了一个toString() 方法以进行演示。

class Node {

    int key;
    String name;

    Node leftChild;
    Node rightChild;

    Node(int key, String name) {
        this.key = key;
        this.name = name;
    }

    public String toString() {
        return "[" + key + "," + name + "]";
    }
}

BinaryTree 也稍作修改:

class BinaryTree {

    public Node root;

    public BinaryTree copyTree(Node focusNode) {
        BinaryTree bt = new BinaryTree();
        bt.root = preOrderCopy(focusNode);
        return bt;
    }

    public static void preOrderPrint(BinaryTree t) {
        preOrderPrint(t.root);
    }

    public static void preOrderPrint(Node n) {
        if (n == null) {
            // base case
            return;
        }
        System.out.println(n);
        preOrderPrint(n.leftChild);
        preOrderPrint(n.rightChild);

    }

    private Node preOrderCopy(Node focusNode) {
        if (focusNode == null) {
            // base case
            return null;
        }
        Node copy = new Node(focusNode.key, focusNode.name);
        copy.leftChild = preOrderCopy(focusNode.leftChild);
        copy.rightChild = preOrderCopy(focusNode.rightChild);
        return copy;
    }

}

为了测试代码,我根据Wikipedia page for Tree Traversal 上显示的代码创建了一个BinaryTree。这是此示例中使用的树的图片:

此示例的正确预购遍历是:F, B, A, D, C, E, G, I, H。您可以使用以下代码来测试此实现:

public class NodeTest {

    public static void main(String[] args) {
        BinaryTree bt = new BinaryTree();
        Node a = new Node(1, "A");
        Node b = new Node(2, "B");
        Node c = new Node(3, "C");
        Node d = new Node(4, "D");
        Node e = new Node(5, "E");
        Node f = new Node(6, "F");
        Node g = new Node(7, "G");
        Node h = new Node(8, "H");
        Node i = new Node(9, "I");
        f.leftChild = b;
        b.leftChild = a;
        b.rightChild = d;
        d.leftChild = c;
        d.rightChild = e;
        f.rightChild = g;
        g.rightChild = i;
        i.leftChild = h;
        bt.root = f;

        System.out.println("Print full tree:");
        BinaryTree.preOrderPrint(bt.copyTree(f));

        System.out.println("Only print f's left sub-tree:");
        BinaryTree.preOrderPrint(bt.copyTree(f.leftChild));

    }

}

运行上述代码会产生以下输出:

Print full tree:
[6,F]
[2,B]
[1,A]
[4,D]
[3,C]
[5,E]
[7,G]
[9,I]
[8,H]
Only print f's left sub-tree:
[2,B]
[1,A]
[4,D]
[3,C]
[5,E]

【讨论】:

    【解决方案2】:

    从树 a 复制到树 b。你可以像我一样使用两种静态方法。我的想法来自添加 Element 方法和删除 Element 方法。它们很相似。

    public static Node copyRec(Node a, Node b)//copy from b to a
    {
        if(b!=null)
        {
            a=new Node(b.data);
            a.leftChild=copyRec(a.leftChild,b.leftChild);
            a.rightChild=copyRec(a.rightChild,b.rightChild);
            return a;
        }
        return null;
    }
    public static void copy(BST a, BST b)
    {
        a.root=copyRec(a.root,b.root);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2021-07-07
      相关资源
      最近更新 更多