2016-11-17 86 views
1

在过去的一段时间里,我一直在处理Binary Trees。我似乎遇到麻烦的一项任务是显示BinaryTree类的preOrderTraversal和postOrderTraversal方法。目前,我只能显示displayInOrder方法。我能做些什么来解决这个错误?Java:显示前序和后序遍历

public class BinaryTree { 
BinaryTreeNode root = null; 

public void insertInTree (int newData) { 
    if (root == null) 
     root = new BinaryTreeNode(newData); 
    else root.insert(newData); 
    } 


    public void displayInOrder() { 
     displayInOrder (root); 
    } 

    public void preOrderTraversal() { 
     preOrderTraversal (root); 
    } 

    public void postOrderTraversal() { 
     postOrderTraversal (root); 
    } 

    public void preOrderTraversal (BinaryTreeNode subRoot) { 
     if (subRoot == null) return; 
     preOrderTraversal(subRoot.getLeft()); 
     System.out.println(" " + subRoot.getData() + " "); 
     preOrderTraversal(subRoot.getRight()); 
    } 

    public void postOrderTraversal (BinaryTreeNode subRoot) { 
     if (subRoot == null) return; 
     postOrderTraversal(subRoot.getLeft()); 
     System.out.println(" " + subRoot.getData() + " "); 
     postOrderTraversal(subRoot.getRight()); 
    } 

    public void displayInOrder (BinaryTreeNode subRoot){ 
     if (subRoot == null) return; 
     displayInOrder (subRoot.getLeft()); 
     System.out.print(" " + subRoot.getData() + " "); 
     displayInOrder (subRoot.getRight()); 

    } 


    } 

public class BinaryTreeNode { 
private int data; 
private BinaryTreeNode left; 
private BinaryTreeNode right; 

public BinaryTreeNode() { 
    left = null; right = null; data = 0; 
} 
public BinaryTreeNode(int data) { 
    left = null; right = null; this.data = data; 
} 
public int getData() { 
    return data; 
} 
public BinaryTreeNode getLeft() { 
    return left; 
} 
public BinaryTreeNode getRight() { 
    return right; 
} 
public void insert (int newData) { 
    if (newData < data) { 
     if (left == null) 
      left = new BinaryTreeNode(newData); 
     else left.insert(newData); 
    } else if (newData > data) { 
     if (right == null) 
      right = new BinaryTreeNode(newData); 
     else right.insert(newData); 
    } else 
     System.out.println("Duplicate – not adding……" + newData); 
} 



} 




public class BinaryTreeExample { 

public static void main(String[] args) { 
    BinaryTree tree = new BinaryTree(); 

    tree.insertInTree(6); 
    tree.insertInTree(3); 
    tree.insertInTree(9); 
    tree.insertInTree(1); 
    tree.insertInTree(15); 
    tree.insertInTree(7); 

    tree.displayInOrder(); 

} 

} 
+0

因为你只调用这个'tree.displayInOrder();'错过了其他的功能调用 –

+0

我能解决这个问题,并修改我的代码。我可以显示树,但是显示的preOrder和postOrder遍历方法仍然是错误的。它们显示,但它与displayInOrder方法的顺序相同。 – xy1990

+0

这不是很难,简单地说我建议你的逻辑工作,并使用调试,看看代码中究竟发生了什么 –

回答

0

简称遍历定义:

  • “以”=左,自我吧
  • “预购”=自我,左,右
  • “后序”=左,正确,自我

将它应用到您的代码中,您只需要将“自我打印”行移动到:

public void preOrderTraversal (BinaryTreeNode subRoot) { 
    if (subRoot == null) return; 
    System.out.print(" " + subRoot.getData() + " "); 
    preOrderTraversal(subRoot.getLeft()); 
    preOrderTraversal(subRoot.getRight()); 
} 

public void postOrderTraversal (BinaryTreeNode subRoot) { 
    if (subRoot == null) return; 
    postOrderTraversal(subRoot.getLeft()); 
    postOrderTraversal(subRoot.getRight()); 
    System.out.print(" " + subRoot.getData() + " "); 
} 

// already correct 
public void displayInOrder (BinaryTreeNode subRoot){ 
    if (subRoot == null) return; 
    displayInOrder (subRoot.getLeft()); 
    System.out.print(" " + subRoot.getData() + " "); 
    displayInOrder (subRoot.getRight()); 
} 

这些方法只是打印内容。您需要打印最终换行符在包装方法:

public void displayInOrder() { 
    displayInOrder (root); 
    System.out.println(); 
} 

public void preOrderTraversal() { 
    preOrderTraversal (root); 
    System.out.println(); 
} 

public void postOrderTraversal() { 
    postOrderTraversal (root); 
    System.out.println(); 
} 
+0

谢谢,这真的有帮助。还有一件事,当它显示时,它有一个奇怪的格式。 displayInOrder显示为1,3,6,7,9,15,但使用preOrderTraversal方法时,它显示6(从第一行的15开始继续),然后显示3,1,9,7,15,并显示这些数字一条单独的线。 postOrderTraversal与1,3,7,15,9,6相同的东西 – xy1990

+0

http://imgur.com/a/uduO1这就是我的意思。 – xy1990

+0

我甚至没有注意到打印类型。见编辑的答案。仅供参考我会重构这个收集传递给内部方法的列表中的节点,然后使用通用代码呈现列表。你也可以通过将lambda传递给3个部分而获得幻想,并且由于只有一个内部方法,但这可能会太过分。 – Bohemian