1.问题的由来:今天在实现二叉树的创建和遍历的时候,发现在(二叉树的建立的参数的)代码中少了一个引用符号,然后编译器会报错:”使用了未初始化的局部变量“,在我使用了引用之后,便没有了这样的错误。
2.给出代码
1 #include<iostream> 2 using namespace std; 3 4 typedef char element_type; //declare that element's type is char 5 typedef struct Bnode { 6 element_type data; 7 struct Bnode *Lson, *Rson; 8 } Bnode, *Bptr; 9 //create a prologue Btree 10 int createBtree(Bptr &T) { 11 char data; 12 cin >> data; 13 if (data == '#') { 14 T = NULL; 15 } 16 else { 17 T = new Bnode();//assign the space for the root 18 T->data = data; 19 createBtree(T->Lson); 20 createBtree(T->Rson); 21 } 22 return 0; 23 } 24 void visit(Bptr T) { 25 if (T->data != '#') { 26 cout << T->data; 27 } 28 } 29 void inorder(Bptr p) { //p points to the root of the Btree 30 if (p == NULL) return; 31 inorder(p->Lson); 32 visit(p); 33 inorder(p->Rson); 34 } 35 void postorder(Bptr p) { //p points to the root of the Btree 36 if (p == NULL) return; 37 postorder(p->Lson); 38 postorder(p->Rson); 39 visit(p); 40 } 41 int main() 42 { 43 Bptr T; 44 cout << "输入字符串,建立二叉树: "; 45 createBtree(T); 46 cout << "二叉树的中序遍历: "; 47 inorder(T); 48 cout << endl; 49 cout << "二叉树的后序遍历: "; 50 postorder(T); 51 cout << endl; 52 system("pause"); 53 }
3.问题出在第10行。
4.做过了哪些尝试:
(1)把43行改为:Bptr T=NULL。结果编译成功了,但是没有实现功能
5.疑问:为什么要用引用? 为什么遍历函数不用引用就没事,而构建二叉树必须要引用参数呢?
43 Bptr T; 44 cout << "输入字符串,建立二叉树: "; 45 createBtree(T);
你的想法应该是通过createBtree构建出来T这个变量,如果不加引用,那么
这个类型是指针类型,透过函数传递时,传递的是其值,这个值由于没有初始化值,是内存的一个随机值
createBtree函数里面把T的值给改了,这个是函数局部的,修改传递不出去,因此外部没法用
专家说的对啊