我刚学java,试着写一个递归建立的二叉树,可是在无法递归遍历出来,希望大虾们帮帮忙,看看问题出在哪里
import java.util.*;public class MyTree {
public static void main(String args[])
{
MyBinaryTree t = new MyBinaryTree();

t.createTree(t.root);
t.showTree(t.root);
}
}
class MyBinaryTree{
public TreeNode root;
MyBinaryTree()
{
root = null;
}
public void createTree(TreeNode node)
{
Scanner sc = new Scanner(System.in);
int data = sc.nextInt();
if(data == 0)
{
return;
}
else
{
node = new TreeNode();
node.data = data;
createTree(node.left);
createTree(node.right);
}
}
public void showTree(TreeNode node)
{
if(node != null)
{
System.out.println(node.data+"");
showTree(node.left);
showTree(node.right);
}
}

}class TreeNode{
int data;
TreeNode left;
TreeNode right;
TreeNode()
{
left = null;
right = null;
}
}

解决方案 »

  1.   

    先序遍历部分应该没有问题,只是你的createTree写的蛮古怪的
      

  2.   


    import java.util.Scanner;
    public class myTree
    {
       public static void main(String [] args)
       {
          myBST t = new myBST();
          Scanner sc = new Scanner(System.in);
          while(true)
          {
             System.out.print("Please enter a int: ");
             int data = sc.nextInt();
             if(data == 0)
             {
                break;
                }
             t.create(data);
             }
          t.showTree();
          }
       }
    class treeNode
    {
       private int data;
       private treeNode left;
       private treeNode right;
       public treeNode(int data)
       {
          this.data = data;
          this.left = null;
          this.right = null;
          }
       public int getData()
       {
          return this.data;
          }
       public treeNode getLeft()
       {
          return this.left;
          }
       public treeNode getRight()
       {
          return this.right;
          }
       public void setLeft(treeNode left)
       {
          this.left = left;
          }
       public void setRight(treeNode right)
       {
          this.right = right;
          }
       }
    class myBST
    {
       private treeNode root;
       private int size;
       public myBST()
       {
          root = null;
          size = 0;
          }
       public void create(int data)
       {
          treeNode node = new treeNode(data);
          treeNode localRoot = this.root;
          if(this.root == null)
          {
             this.root = node;
             }
          else
          {
             localRoot = createTree(localRoot,node);
             if(node.getData()<localRoot.getData())
             {
                localRoot.setLeft(node);
                this.size++;
                }
             else
             {
                localRoot.setRight(node);
                this.size++;
                }
             }
          }
      
       private treeNode createTree(treeNode localRoot,treeNode node)
       {
       
          if(node.getData()>localRoot.getData() && localRoot.getRight() != null)
          {
             localRoot = localRoot.getRight();
             return createTree(localRoot,node);
             }
          else if(node.getData()<localRoot.getData()&&localRoot.getLeft()!= null)
          {
             localRoot = localRoot.getLeft();
             return createTree(localRoot,node);
             }
          return localRoot;
          }
       public void showTree()
       {
          showTreeInOrder(this.root);
          }
       private void showTreeInOrder(treeNode n)
       {
          if(n!=null)
          {
             showTreeInOrder(n.getLeft());
             System.out.println(n.getData());
             showTreeInOrder(n.getRight());
             }
          return;
          }
       }
      

  3.   

    你的showTree()方法是没用的,你在creatTree()里 node = new TreeNode()作用域指在creatTree()方法里
      

  4.   


    package tree;public class Tree { private int data;// 数据节点 private Tree left;// 左子树 private Tree right;// 右子树 public Tree(int data) {
    this.data = data;
    this.left = null;
    this.right = null;
    } /**
     * 创建二叉树,返回根结点
     *
     * @param input
     * @return
     */
    public static Tree createTree(int[] input) {
    Tree root = null;
    Tree temp = null;
    for (int i = 0; i < input.length; i++) {
    // 创建根节点
    if (root == null) {
    root = temp = new Tree(input[i]);//此时左右两边都是空
    } else {
    // 回到根结点
    temp = root;
    // 添加节点
    while (temp.data != input[i]) {
    if (input[i] <= temp.data) {
    if (temp.left != null) {
    temp = temp.left; //左节点往下移动
    } else {
    temp.left = new Tree(input[i]);//这个时候root也改变了 }
    } else {
    if (temp.right != null) {
    temp = temp.right;//
    } else {
    temp.right = new Tree(input[i]);//这个时候root也改变了
    }
    }
    } }
    }
    return root;
    } /**
     * 前序遍历
     *
     * @param tree
     */
    public static void preOrder(Tree tree) {
    if (tree != null) {
    System.out.print(tree.data + " ");
    preOrder(tree.left);
    preOrder(tree.right);
    }
    } /**
     * 中序遍历
     *
     * @param tree
     */
    public static void midOrder(Tree tree) {
    if (tree != null) {
    midOrder(tree.left);
    System.out.print(tree.data + " ");
    midOrder(tree.right);
    }
    } /**
     * 后序遍历
     *
     * @param tree
     */
    public static void posOrder(Tree tree) {
    if (tree != null) {
    posOrder(tree.left);
    posOrder(tree.right);
    System.out.print(tree.data + " ");
    }
    } /**
     * @param args
     */
    public static void main(String[] args) {
    int[] input = { 4, 2, 6, 1, 3, 5, 7 };
    // int[] input = { 1, 1, 1, 1, 1, 1, 1 };
    Tree tree = createTree(input);
    System.out.print("前序遍历:");
    preOrder(tree);
    System.out.print("\n中序遍历:");
    midOrder(tree);
    System.out.print("\n后序遍历:");
    posOrder(tree);
    System.out.println(Runtime.getRuntime().totalMemory());
    ; }
    }
      

  5.   

    http://tech.ddvip.com/2008-12/122847009897802.html
    请参考这个
      

  6.   

    这是用递归前序建立二叉树,我用C++这样写可以的,不过换成java就不行,不知道是什么原因
      

  7.   

    终于找到原因了 原来在createTree方法中的对象引用的指向上面出错了,看来java掌握得还不好
       public void createTree(TreeNode node)
        {
            Scanner sc = new Scanner(System.in);
            int data = sc.nextInt();
            if(data == 0)
            {
                return;
            }
            else
            {
                if(node == null)
                {
                    node = new TreeNode();
                }
                node.data = data;
                createTree(node.left);
                createTree(node.right);
            }
        }
    改成这样就OK了