【问题标题】:Mirroring a Binary Tree in Java在 Java 中镜像二叉树
【发布时间】:2018-01-04 15:40:40
【问题描述】:

我目前正在高中学习 Java 数据结构课程,我需要帮助镜像一棵树。下面我有我所有有用的代码和两种解决 mirrorImage 方法的方法,由于某种未知的原因,它们总是返回 null。我的主要问题是,为什么这些方法不起作用?我该如何解决?我认为这可能与我正在使用的树本身有关,因为 insert 方法无法正常工作。

提前致谢,这是我第一次在 Stack Overflow 上发帖,期待!

注意:这个方法不是我的功课,我只是为了自己好

public class TreeLab {

  public static void main(String[] args)
  {
    String s = "XCOMPUTERSCIENCE";

    TreeNode root = new TreeNode("" + s.charAt(1), null, null);

    for(int pos = 2; pos < s.length(); pos++)
        insert(root, "" + s.charAt(pos), pos, (int)(1 + Math.log(pos) / 
        Math.log(2)));

    insert(root, "B", 17, 5); 
    insert(root, "A", 18, 5); 
    insert(root, "C", 37, 6); //B's right child

    // display the tree sideways
    display(root, 0);

    System.out.println("\n\nMirror Image: ");
    display(root.mirrorImage(), 0);
  }


  public static void insert(TreeNode t, String s, int pos, int level) {

    TreeNode p = t;
    for(int k = level - 2; k > 0; k--)
        if((pos & (1 << k)) == 0) 
            p = p.getLeft();
        else                        
            p = p.getRight();

    if((pos & 1) == 0)
        p.setLeft(new TreeNode(s, null, null));
    else
        p.setRight(new TreeNode(s, null, null));
  } // end of insert


  //postcondition: display the tree sideways
  public static void display(TreeNode t, int level) {
    if(t == null)
        return;
    display(t.getRight(), level + 1); //recurse right

    for(int k = 0; k < level; k++)
        System.out.print("\t");
    System.out.println(t.getValue());

    display(t.getLeft(), level + 1); //recurse left
  }  // end of display

  public static TreeNode mirrorImage (TreeNode t) {

    //way 1
    /*
    if (t == null)
        return null;

    TreeNode right = t.getRight();
    TreeNode left = t.getLeft();

    t.setLeft(mirrorImage(right));
    t.setRight(mirrorImage(left));

    return t;
    */      

    //way 2
    /*
    if (t == null)
        return null;
    else
        return new TreeNode (t.getValue(), mirrorImage(t.getRight()), 
      mirrorImage(t.getLeft()));
    */      

    return null; //only here to help complile
  }
}//end of TreeLab

//TreeNode class

class TreeNode {

  private Object value; 
  private TreeNode left, right;

  public TreeNode(Object initValue) { 
    value = initValue; 
    left = null; 
    right = null; 
  }

  public TreeNode mirrorImage() {
    return null;
  }

  public TreeNode(Object initValue, TreeNode initLeft, TreeNode initRight) { 
    value = initValue; 
    left = initLeft; 
    right = initRight; 
  }

  public Object getValue() { 
    return value; 
  }

  public TreeNode getLeft()  { 
    return left; 
  }

  public TreeNode getRight()  { 
    return right; 
  }

  public void setValue(Object theNewValue)  { 
    value = theNewValue; 
  }

  public void setLeft(TreeNode theNewLeft)  { 
    left = theNewLeft;
  }

  public void setRight(TreeNode theNewRight) { 
    right = theNewRight;
  }
}

【问题讨论】:

  • 您是否使用调试器来检查您的代码中发生了什么?
  • 你在TreeNode 类中的mirrorImage 方法除了return null; 什么都不做,这就是你调用的方法。 TreeLab 中的 static mirrorImage 方法目前也只返回 null。但是,即使您以当前禁用的“方式”之一进行评论,您也永远不会调用该方法。

标签: java data-structures tree binary-tree mirroring


【解决方案1】:

在您的mirrorImage 方法中,您应该创建一个作为参数获得的节点的新副本(现在您只需重新分配其左右属性)并递归地复制其子节点:

public static TreeNode mirrorImage(TreeNode t) {
    if (t == null) {
        return null;
    }
    return new TreeNode(
        t.getValue(),
        mirrorImage(t.getLeft()),
        mirrorImage(t.getRight())
    );
}

【讨论】:

  • 不知道当他甚至从未调用它开始时更改该方法会对他有什么帮助;)
  • 他在那里打电话给display(root.mirrorImage(), 0);。他可以使用我为TreeNode::mirrorImage 方法或静态方法发布的代码。他在询问复制树的方法。但是,是的,最好检查调用了哪个方法。
【解决方案2】:

我相信我发现了自己的错误。我调用 root.mirrorImage() 而不是 mirrorImage(root),导致它传递给我意外生成的 TreeNode() 类中的 mirrorImage() 方法,并且总是返回 null。更改此设置后,我知道我解决该方法的两种方法都可以正常工作。谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多