二叉树前序遍历时程序崩溃
- C/C++ code
#include <stdio.h>#include <stdlib.h>typedef struct bitnode{ int data; struct bitnode *lchild,*rchild; }bitnode; void createbitree(bitnode *t){ //前序遍历创建二叉树 char ch; ch = getchar(); if(ch == '.') t = NULL; else{ t = (bitnode *)malloc(sizeof(bitnode)); t->data = ch; //生成根结点; createbitree(t->lchild); //构造左子树; createbitree(t->rchild); //构造右子树; } } void preorder(bitnode *t){ //前序遍历显示二叉树 if (t == NULL) return; printf("%c",t->data); preorder(t->lchild); preorder(t->rchild); } int main(int argc, char *argv[]){ bitnode *t; createbitree(t); printf("二叉树已建立\n"); //这一步能正常显示。 preorder(t); //。。。。。出问题的代码。。。。。。。 system("PAUSE"); return 0;}
编译能通过,也能成功创建二叉树,程序在显示完“二叉树已建立”几秒后程序崩溃,提示“程序已停止工作”。
不知道哪里写错了,请各位指正,谢谢。
[解决办法]
楼主用的啥编译器,printf("二叉树已建立\n");能正常显示?
函数形参不能改变外部实参,除非用双重指针,或者其他方法。
[解决办法]
createbitree(&t);
要注意传二级指针,然后创建的函数内解一次引用再创建,否则建起来的只是以t的拷贝为根的树。而不是以t为根。
[解决办法]
- C/C++ code
void createbitree(bitnode **t){ //前序遍历创建二叉树 char ch; ch = getchar(); if(ch == '.') *t = NULL; else{ *t = (bitnode *)malloc(sizeof(bitnode)); (*t)->data = ch; //生成根结点; createbitree(&(*t)->lchild); //构造左子树; createbitree(&(*t)->rchild); //构造右子树; }}
[解决办法]
顶楼上。。。楼主的这样的做法只是简单的值传递!要用二维指针,进行地址传递!