user-0 提问: 数据结构，二叉树问题。帮我看看！

回复:
user: user-0
content: 引用 18 楼 crcr 的回复: 在vc6调试没有问题，只是先序遍历少了一句话遍历右子树  createbitree 函数中的参数t是一个指针，你要对他赋值，就应该传入指针的指针 否则你在函数中修改的只是t的一个副本，而不是你主函数里的t  这个函数有返回值了，所以就可以是一级指针了，如果没有返回值，需要二级指针 谢谢！给‘t’赋值是不是就是楼上那种？

user: user-0
content: 引用 20 楼 qq_26153041 的回复:1.楼主你的代码让人不忍直视，排版不合理  2.t = createbitree(t);按照你的想法，创建这个你要的结构，在函数内部创建了之后有两种办法在main（）函数中得到所创建的结构体指针，一种用t=createbitree()，t接受指针，第二种用createbitree(&t)这样的形式，第一种不多说，第二种的话，函数声明createbitree(bitree* s) 内部用*s=(bitnode*)malloc(sizeof(bitnode));这样你的main函数中就可以得到你在createbitree中构造的结构指针 小白一枚！请谅解！我在试试！不懂了，再请教你们！

user: user-1
content: 1.楼主你的代码让人不忍直视，排版不合理  2.t = createbitree(t);按照你的想法，创建这个你要的结构，在函数内部创建了之后有两种办法在main（）函数中得到所创建的结构体指针，一种用t=createbitree()，t接受指针，第二种用createbitree(&t)这样的形式，第一种不多说，第二种的话，函数声明createbitree(bitree* s) 内部用*s=(bitnode*)malloc(sizeof(bitnode));这样你的main函数中就可以得到你在createbitree中构造的结构指针

user: user-0
content: 引用 15 楼 paschen 的回复:[quote=引用 14 楼 TmacT 的回复:] [quote=引用 13 楼 paschen 的回复:] [quote=引用 11 楼 TmacT 的回复:] [quote=引用 10 楼 paschen 的回复:] [quote=引用 7 楼 TmacT 的回复:] [quote=引用 6 楼 paschen 的回复:] 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧[/quote]  主函数中bitree t = new bitnode;[/quote] 还是不行！[/quote]  你不是定义过bitnode了！ 那你写成 bitnode b; bitree t = &b;[/quote] 可以，但是出现了和9楼一样的提示！！是不是编译器的问题？[/quote]  你代码没具体看，不知你输入要怎么输入，可以自己点中断然后分析原因[/quote] 恩 好的！谢谢了！等会结贴给你们分！

user: user-2
content: 引用 14 楼 TmacT 的回复:[quote=引用 13 楼 paschen 的回复:] [quote=引用 11 楼 TmacT 的回复:] [quote=引用 10 楼 paschen 的回复:] [quote=引用 7 楼 TmacT 的回复:] [quote=引用 6 楼 paschen 的回复:] 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧[/quote]  主函数中bitree t = new bitnode;[/quote] 还是不行！[/quote]  你不是定义过bitnode了！ 那你写成 bitnode b; bitree t = &b;[/quote] 可以，但是出现了和9楼一样的提示！！是不是编译器的问题？[/quote]  你代码没具体看，不知你输入要怎么输入，可以自己点中断然后分析原因

user: user-0
content: 引用 13 楼 paschen 的回复:[quote=引用 11 楼 TmacT 的回复:] [quote=引用 10 楼 paschen 的回复:] [quote=引用 7 楼 TmacT 的回复:] [quote=引用 6 楼 paschen 的回复:] 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧[/quote]  主函数中bitree t = new bitnode;[/quote] 还是不行！[/quote]  你不是定义过bitnode了！ 那你写成 bitnode b; bitree t = &b;[/quote] 可以，但是出现了和9楼一样的提示！！是不是编译器的问题？

user: user-2
content: 引用 11 楼 TmacT 的回复:[quote=引用 10 楼 paschen 的回复:] [quote=引用 7 楼 TmacT 的回复:] [quote=引用 6 楼 paschen 的回复:] 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧[/quote]  主函数中bitree t = new bitnode;[/quote] 还是不行！[/quote]  你不是定义过bitnode了！ 那你写成 bitnode b; bitree t = &b;

user: user-0
content: 引用 8 楼 linzertling 的回复:[quote=引用 5 楼 TmacT 的回复:] [quote=引用 4 楼 linzertling 的回复:] [quote=引用 2 楼 TmacT 的回复:] 是的！但是不知道从哪开始给 t 赋值！  在main函数里边bitree t处赋值。你的creatbitree函数完全没必要输入t啊[/quote]  我在bitree t;下面赋值t=‘%d';吧creatbitree=t;删掉了！能运行了，但是在先序遍历哪里出错！是不是我的赋值有问题！还是我上面个的代码有问题！[/quote]  你在先序遍历程序里边的递归函数有问题，递归函数输入的是指针，而你输入的是t->lchild,这是一个数，并非指针，试试改成指针*（t->lchild），另外，你说运行到这里出错了，错误提示是什么？[/quote] 出现那个错误是不是和编译器有关？

user: user-0
content: 引用 10 楼 paschen 的回复:[quote=引用 7 楼 TmacT 的回复:] [quote=引用 6 楼 paschen 的回复:] 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧[/quote]  主函数中bitree t = new bitnode;[/quote] 还是不行！

user: user-2
content: 引用 7 楼 TmacT 的回复:[quote=引用 6 楼 paschen 的回复:] 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧[/quote]  主函数中bitree t = new bitnode;

user: user-0
content: 引用 8 楼 linzertling 的回复:[quote=引用 5 楼 TmacT 的回复:] [quote=引用 4 楼 linzertling 的回复:] [quote=引用 2 楼 TmacT 的回复:] 是的！但是不知道从哪开始给 t 赋值！  在main函数里边bitree t处赋值。你的creatbitree函数完全没必要输入t啊[/quote]  我在bitree t;下面赋值t=‘%d';吧creatbitree=t;删掉了！能运行了，但是在先序遍历哪里出错！是不是我的赋值有问题！还是我上面个的代码有问题！[/quote]  你在先序遍历程序里边的递归函数有问题，递归函数输入的是指针，而你输入的是t->lchild,这是一个数，并非指针，试试改成指针*（t->lchild），另外，你说运行到这里出错了，错误提示是什么？ [/quote] 图片是错误提示！改了之后还是不行！还是同样提示！

user: user-3
content: 引用 5 楼 TmacT 的回复:[quote=引用 4 楼 linzertling 的回复:] [quote=引用 2 楼 TmacT 的回复:] 是的！但是不知道从哪开始给 t 赋值！  在main函数里边bitree t处赋值。你的creatbitree函数完全没必要输入t啊[/quote]  我在bitree t;下面赋值t=‘%d';吧creatbitree=t;删掉了！能运行了，但是在先序遍历哪里出错！是不是我的赋值有问题！还是我上面个的代码有问题！[/quote]  你在先序遍历程序里边的递归函数有问题，递归函数输入的是指针，而你输入的是t->lchild,这是一个数，并非指针，试试改成指针*（t->lchild），另外，你说运行到这里出错了，错误提示是什么？

user: user-0
content: 引用 6 楼 paschen 的回复:就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理  还是不明白！你可想而知我的知识有多差劲 吧

user: user-2
content: 就好比你一个交换函数如果写成：void swap(int a, int b)的话，并不能达到真正的交换，交换的只是一个副本，你这里同理

user: user-0
content: 引用 4 楼 linzertling 的回复:[quote=引用 2 楼 TmacT 的回复:] 是的！但是不知道从哪开始给 t 赋值！  在main函数里边bitree t处赋值。你的creatbitree函数完全没必要输入t啊[/quote]  我在bitree t;下面赋值t=‘%d';吧creatbitree=t;删掉了！能运行了，但是在先序遍历哪里出错！是不是我的赋值有问题！还是我上面个的代码有问题！

user: user-3
content: 引用 2 楼 TmacT 的回复:是的！但是不知道从哪开始给 t 赋值！  在main函数里边bitree t处赋值。你的creatbitree函数完全没必要输入t啊

user: user-2
content: createbitree 函数中的参数t是一个指针，你要对他赋值，就应该传入指针的指针 否则你在函数中修改的只是t的一个副本，而不是你主函数里的t

user: user-0
content: 是的！但是不知道从哪开始给 t 赋值！

user: user-3
content: 不是提示你了吗，t没有初始化

user: user-4
content: 在vc6调试没有问题，只是先序遍历少了一句话遍历右子树  createbitree 函数中的参数t是一个指针，你要对他赋值，就应该传入指针的指针 否则你在函数中修改的只是t的一个副本，而不是你主函数里的t  这个函数有返回值了，所以就可以是一级指针了，如果没有返回值，需要二级指针