先序和中序建立二叉树,然后再输出出来
下面是我的程序,没有错误,可是点击运行之后没有任何结果,请高手指出错误,不胜感激!package binary.tree;public class TreeNode {
char data;
TreeNode lChild;
TreeNode rChild;


public TreeNode()
{
lChild=null;
rChild=null;
}


public TreeNode(char data)
{
this.data=data;
this.lChild=null;
this.rChild=null;
}
}package binary.tree;public class Tree {
TreeNode root;


//从strStart位置开始查找c的在字符数组s中的位置,返回下标
int pos(char c,char s[],int strStart) 
{

for(int i=strStart;i<s.length;i++)
{
if(s[i]==c) return i;
}
return -1;




//创建一棵树
void createTree(TreeNode root,char[] preOrder,int strStart1,char[] inOrder,int strStart2,int len)
{
int tempLocation;
int rlen;
int llen;
if(len<=0){root=null;return;}
else
{
root=new TreeNode(preOrder[strStart1]);
tempLocation=pos(preOrder[strStart1],inOrder,strStart2);
llen=tempLocation-strStart2;
rlen=len-(llen+1);
createTree(root.lChild,preOrder,strStart1+1,inOrder,strStart2,llen);
createTree(root.rChild,preOrder,strStart1+llen+1,inOrder,tempLocation+1,rlen);

}
}



//遍历这棵树
void inTravelTree(TreeNode root)
{
if(root!=null)
{
inTravelTree(root.lChild);
System.out.println(root.data+"");
inTravelTree(root.rChild);

}
}
}
package binary.tree;public class TreeApp { /**
 * @param args
 */
public static void main(String[] args)
{
// TODO Auto-generated method stub

char[] preOrder={'A','B','C','D','E','F','G','H','I','J','K','L'};
char[] inOrder={'C','E','D','F','B','A','I','H','G','K','J','L'};
Tree tree;
tree=new Tree();
tree.createTree(tree.root, preOrder,0,inOrder, 0, preOrder.length);
tree.inTravelTree(tree.root);
   }
}

解决方案 »

  1.   

    把createTree方法的两行改成下面这样:
    root.lChild = new TreeNode(preOrder[strStart1]); 
    root.rChild = new TreeNode(inOrder[strStart2]);
      

  2.   

    这是典型的值传递造成的问题。
    代码帮你改了一下。package binary.tree; 
    public class Tree {    // 从strStart位置开始查找c的在字符数组s中的位置,返回下标
        int pos(char c, char s[], int strStart) {        for (int i = strStart; i < s.length; i++) {
                if (s[i] == c)
                    return i;
            }
            return -1;    }    /**
         * 创建一棵树
          * 此函数的参数及返回值有改动 
         */
        TreeNode createTree(char[] preOrder, int strStart1,
                char[] inOrder, int strStart2, int len) {
            // 对象在内部创建
            TreeNode root = null;        int tempLocation;
            int rlen;
            int llen;
            if (len <= 0) {
                return null;
            } else {
                // 函数中通过变量赋值的方式不会返回到调用方
                root = new TreeNode(preOrder[strStart1]);
                tempLocation = pos(preOrder[strStart1], inOrder, strStart2);
                llen = tempLocation - strStart2;
                rlen = len - (llen + 1);
                root.lChild = createTree(preOrder, strStart1 + 1, inOrder,
                        strStart2, llen);
                root.rChild = createTree(preOrder, strStart1 + llen + 1, inOrder,
                        tempLocation + 1, rlen);            // 必须通过返回值的方式将新生成的对象交给调用方使用。
                return root;
            }
        }    // 遍历这棵树
        void inTravelTree(TreeNode root) {
            if (root != null) {
                System.out.println(root.data + "");
                inTravelTree(root.lChild);
                inTravelTree(root.rChild);        }
        }
    }package binary.tree; 
    public class TreeApp {
        public static void main(String[] args) {
            // TODO Auto-generated method stub        char[] preOrder = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L' };
            char[] inOrder = { 'C', 'E', 'D', 'F', 'B', 'A', 'I', 'H', 'G', 'K', 'J', 'L' };        // 调用方法有改动
            Tree tree = new Tree();
            TreeNode root = tree.createTree(preOrder, 0, inOrder, 0, preOrder.length);
            tree.inTravelTree(root);
        }
    }
      

  3.   

    关于值传递的定论,网上有许多许多例子可以证明。这里再举个例子:public class Test {   
      
        public static void main(String[] args){   
            java.util.Date date = new java.util.Date(0);   
      
            System.out.println(date);   
            change(date);   
            System.out.println(date);   
        }   
      
        public static void change(java.util.Date date) {   
            // 此处改变了参数(变量)的值   
            date = new java.util.Date(3600000L);   
            System.out.println(date);   
        }   
    }  
    public class Test {    public static void main(String[] args){
            java.util.Date date = new java.util.Date(0);        System.out.println(date);
            change(date);
            System.out.println(date);
        }    public static void change(java.util.Date date) {
            // 此处改变了参数(变量)的值
            date = new java.util.Date(3600000L);
            System.out.println(date);
        }
    }
    上例的输出结果是:
    Thu Jan 01 08:00:00 CST 1970
    Thu Jan 01 09:00:00 CST 1970
    Thu Jan 01 08:00:00 CST 1970 我们稍微改动一下内容:public class Test {   
      
        public static void main(String[] args){   
            java.util.Date date = new java.util.Date(0L);   
      
            System.out.println(date);   
            change(date);   
            System.out.println(date);   
        }   
      
        public static void change(java.util.Date date) {   
            // 此处改变了对象的内容   
            date.setTime(3600000L);   
            System.out.println(date);   
        }   
    }  
    public class Test {    public static void main(String[] args){
            java.util.Date date = new java.util.Date(0L);        System.out.println(date);
            change(date);
            System.out.println(date);
        }    public static void change(java.util.Date date) {
            // 此处改变了对象的内容
            date.setTime(3600000L);
            System.out.println(date);
        }
    }
    上例的输出结果是:
    Thu Jan 01 08:00:00 CST 1970
    Thu Jan 01 09:00:00 CST 1970
    Thu Jan 01 09:00:00 CST 1970 当函数调用时,JVM会生成第二个引用类型的变量,并将原始引用变量的值(对象的内存地址)复制给第二个引用变量。 注意,值传递的本质是变量值的复制而不是对象内容的复制。
    第一个例子中,函数内部改变的是第二个引用变量的值,原始引用变量的值没有改变。第二个例子中,函数内部改变的是引用变量所指对象的内容,由于原始引用变量与第二个引用变量的值相等(指向同一个对象),所以导致了函数调用后对象的内容已经改变的事实。