我在调用我编码的类的多个实例(Tree、TreeNode)时遇到问题 在 main 方法中,即使两棵树明显是不同的树,系统也会给出输出 c d j c d j 。 如果我要分开两个 postOrder() 调用(每个调用都在树被插入堆栈后调用)
Stack<Tree> alphaStack = new Stack<Tree>(); TreeNode a = new TreeNode('i'); Tree tree = new Tree(a); TreeNode newleft = new TreeNode('a'); TreeNode newright = new TreeNode('b'); tree.setLeft(a, newleft); tree.setRight(a, newright); alphaStack.push(tree); Tree.postOrder(alphaStack.pop().getRoot()); TreeNode b = new TreeNode('j'); Tree newtree = new Tree(b); TreeNode left = new TreeNode('c'); TreeNode right = new TreeNode('d'); newtree.setLeft(b, left); newtree.setRight(b, right); alphaStack.push(newtree); Tree.postOrder(alphaStack.pop().getRoot());
输出将是 a b i c d j。
这是否意味着我的类不会被重复,而是在我创建新树时被重用?
下面是代码:
import java.util.Stack;
public class mast_score {
public static void main(String[] args){ Stack<Tree> alphaStack = new Stack<Tree>(); TreeNode a = new TreeNode('i'); Tree tree = new Tree(a); TreeNode newleft = new TreeNode('a'); TreeNode newright = new TreeNode('b'); tree.setLeft(a, newleft); tree.setRight(a, newright); alphaStack.push(tree); TreeNode b = new TreeNode('j'); Tree newtree = new Tree(b); TreeNode left = new TreeNode('c'); TreeNode right = new TreeNode('d'); newtree.setLeft(b, left); newtree.setRight(b, right); alphaStack.push(newtree); Tree.postOrder(alphaStack.pop().getRoot()); Tree.postOrder(alphaStack.pop().getRoot());
} }
树节点代码
public class TreeNode{ Object item;
TreeNode parent; TreeNode left; TreeNode right; public TreeNode (Object item) { this.item = item; parent = null; left = null; right = null; } public TreeNode getParent(TreeNode current) throws ItemNotFoundException { if(current == null) throw new ItemNotFoundException("No parent"); if(current.parent == null) throw new ItemNotFoundException("This is the root"); else return current.parent; } public TreeNode getLeft(TreeNode current) throws ItemNotFoundException { if(current == null) throw new ItemNotFoundException("No left or right child"); if(current.left == null) throw new ItemNotFoundException("No left child"); else return current.left; } public TreeNode getRight(TreeNode current) throws ItemNotFoundException { if(current == null) throw new ItemNotFoundException("No left or right child"); if(current.right == null) throw new ItemNotFoundException("No right child"); else return current.right; } public Object getElement() throws ItemNotFoundException { if(this.item == null) throw new ItemNotFoundException("No such node"); else return this.item; } }
树类代码
import java.util.*;
public class Tree {
static TreeNode root; int size; public Tree() { root = null; } public Tree(TreeNode root) { Tree.root = root; } public TreeNode getRoot() { return this.root; } public int getLvl(TreeNode node) { return node.lvlCount; } public void setLeft(TreeNode node, TreeNode left) { node.left = left; } public void setRight(TreeNode node, TreeNode right) { node.right = right; } public static void postOrder(TreeNode root) { if (root != null) { postOrder(root.left); postOrder(root.right); System.out.print(root.item + " "); } else { return; } } public static int getSize(TreeNode root) { if (root != null) { return 1 + getSize(root.left) + getSize(root.right); } else { return 0; } } public static boolean isEmpty(Tree Tree) { return Tree.root == null; } }
最佳答案
您的问题就在这里,在 Tree
类中:
static TreeNode root;
您应该删除“static”一词,并将 Tree.root
替换为 this.root
。
添加关键字 static
会导致变量 root
在程序中的所有 Tree
实例之间共享,这不是您想要的.
关于java - 在java中调用一个类的多个实例时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363700/