由标明空子树的先根遍历序列建立一棵二叉树

package test_6;

public class BTClass {
    BTNode b_49;
    String bstr_49;
    public BTClass() {
        b_49=null;
    }
    int i_49=0;
    
    public void CreatBT_preOrder(BTNode tn_49,String preStr_49) {
        char c_49=preStr_49.charAt(i_49++);
        if(c_49!='#') {
            tn_49=new BTNode(c_49);
            CreatBT_preOrder(tn_49.lchild_49,preStr_49);
            CreatBT_preOrder(tn_49.rchild_49,preStr_49);
            
        }else {
            tn_49=null;
        }
    }
    
    public void preOrder(BTNode tp_49) {
        if(tp_49!=null) {
            System.out.print(tp_49.data_49+" ");
            preOrder(tp_49.lchild_49);
            preOrder(tp_49.rchild_49);
        }
    }    
    
    public static void main(String args[]) {
        BTClass t=new BTClass();
        t.CreatBT_preOrder(t.b_49,"AB#C##D##");
        t.preOrder(t.b_49);
    }
}

要求:由标明空子树的先根遍历序列建立一棵二叉树
我代码中的CreatBT_preOrder就是用来实现此功能的,但是用我的preOrder方法输出的时候,什么都没有输出,似乎在CreatBT_preOrder中声明的左子树右子树对象都死了,请问是为什么呢?我这个代码又该怎么改呢?本人递归和参数传递学得不是很好,希望能讲的细一点。

我们先解决问题,稍后再解决你的疑问

package com.example.demo003.test;

class BTNode<T>{
    BTNode<T> lchild_49;
    BTNode<T> rchild_49;
    T data_49;

    public BTNode(T data_49) {
        this.data_49 = data_49;
    }
}
public class BTClass {
    BTNode<Character> b_49;
    String bstr_49;
    public BTClass() {
        b_49=new BTNode<>('#');
    }
    int i_49=0;
    public void CreatBT_preOrder(BTNode<Character> tn_49,String preStr_49) {
        char c_49=preStr_49.charAt(i_49++);
        if(c_49!='#') {
            tn_49.data_49=c_49;
            tn_49.lchild_49=new BTNode<>('#');
            tn_49.rchild_49=new BTNode<>('#');
            CreatBT_preOrder(tn_49.lchild_49,preStr_49);
            CreatBT_preOrder(tn_49.rchild_49,preStr_49);
        }else {
            tn_49=null;
        }
    }
    public void preOrder(BTNode<Character> tp_49) {
        if(tp_49!=null) {
            System.out.print(tp_49.data_49+" ");
            preOrder(tp_49.lchild_49);
            preOrder(tp_49.rchild_49);
        }
    }
    public static void main(String args[]) {
        BTClass t=new BTClass();
        t.CreatBT_preOrder(t.b_49,"AB#C##D##");
        t.preOrder(t.b_49);
    }
}

你的疑惑解释:

img


对应的代码,你可以自己运行下感受下:

package com.example.demo003.test;

import java.util.Arrays;

public class Test04 {
    private static final String[] data = new String[]{"1"};
    public static void changeData(String[] dataParam) {
        println(dataParam);
        dataParam[0] = "2";
        println(dataParam);
        println(data);
        dataParam = new String[]{"1"};
        println(dataParam);
        println(data);
    }

    private static void println(String[] param) {
        System.out.println(param);
        System.out.println(Arrays.toString(param));
    }

    public static void main(String[] args) {
        println(data);
        changeData(data);
    }
}

在main函数中 t.b_49 为null,即使在CreatBT_preOrder中给它new了新对象,但返回到main依旧是null,


public class BTClass {
    BTNode<Character> b_49;
    String bstr_49;
    public BTClass() {
        b_49=null;
    }
    int i_49=0;

    class BTNode<T> {

        T data_49;
        BTNode lchild_49;
        BTNode rchild_49;

        public BTNode(T t) {
            data_49 = t;
        }
    }

    public BTNode<Character> CreatBT_preOrder(String preStr_49) {
        char c_49=preStr_49.charAt(i_49++);
        if(c_49!='#') {
            BTNode<Character> tn_49 = new BTNode<>(c_49);
            tn_49.lchild_49 = CreatBT_preOrder(preStr_49);
            tn_49.rchild_49 = CreatBT_preOrder(preStr_49);
            return tn_49;

        }else {
            return null;
        }
    }

    public void preOrder(BTNode<Character> tp_49) {
        if(tp_49!=null) {
            System.out.print(tp_49.data_49+" ");
            preOrder(tp_49.lchild_49);
            preOrder(tp_49.rchild_49);
        }
    }

    public static void main(String args[]) {
        BTClass t=new BTClass();
        t.b_49 = t.CreatBT_preOrder("AB#C##D##");
        t.preOrder(t.b_49);
    }
}

试试http://t.csdn.cn/MgHrj

希望有帮助
https://b23.tv/xOBI8Hb