在Java中镜像二叉树
我目前正在高中学习java数据结构课程,我需要帮助镜像一棵树。下面是我所有有用的代码和两种解决mirrorImage方法的方法,由于未知的原因,这两种方法总是返回null。我的主要问题是,为什么这些方法不起作用?我怎样才能修好它呢?我认为这可能与我正在使用的树本身有关,因为insert方法不能正常工作 提前感谢,这是我第一次在Stack Overflow上发帖,我很期待 注意:这个方法不是作业,我只是为了自己好在Java中镜像二叉树,java,data-structures,tree,binary-tree,mirroring,Java,Data Structures,Tree,Binary Tree,Mirroring,我目前正在高中学习java数据结构课程,我需要帮助镜像一棵树。下面是我所有有用的代码和两种解决mirrorImage方法的方法,由于未知的原因,这两种方法总是返回null。我的主要问题是,为什么这些方法不起作用?我怎样才能修好它呢?我认为这可能与我正在使用的树本身有关,因为insert方法不能正常工作 提前感谢,这是我第一次在Stack Overflow上发帖,我很期待 注意:这个方法不是作业,我只是为了自己好 public class TreeLab { public static vo
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;
}
}
公共类树Lab{
公共静态void main(字符串[]args)
{
字符串s=“XCOMPUTERSCIENCE”;
树节点根=新树节点(“+s.charAt(1),null,null);
对于(int pos=2;pos0;k--)
如果((pos&(1在mirrorImage
方法中),您应该创建作为参数获取的节点的新副本(现在您只需重新指定其左属性和右属性),并递归地复制其子节点:
public static TreeNode mirrorImage(TreeNode t) {
if (t == null) {
return null;
}
return new TreeNode(
t.getValue(),
mirrorImage(t.getLeft()),
mirrorImage(t.getRight())
);
}
我相信我已经发现了错误。我调用root.mirrorImage()而不是mirrorImage(root),导致它传递到TreeNode()中的mirrorImage()方法我意外生成并始终返回null的类。更改此项后,我知道我解决此方法的两种方法都能正常工作。谢谢大家!您是否使用调试器检查代码中发生了什么?类树节点中的mirrorImage
方法除了返回null;
之外,什么都不做ats您调用的方法。TreeLab
中的static mirrorImage
方法当前也只返回null。但是,即使您以当前禁用的“方式”之一进行注释,您也不会从一开始就调用该方法。不确定更改该方法对他有何帮助;)他调用display(root.mirrorImage(),0);
在那里。他可以使用我发布的用于TreeNode::mirrorImage
方法或静态方法的代码。他询问复制树的方法。但是,是的,检查调用了哪个方法很好。