typedef struct BiTNode {
TElemType data;//结点数据域
struct BiTNode* lchild, * rchild;//结点指针域
}BiTNode,*BiTree;
/*------先序遍历的顺序建立二叉链表-------*/ void CreateBiTree(BiTree& T) { //按先序次序输入二叉树中结点的值(一个字符)、创建二叉链表表示的二叉树T TElemType ch; cin >> ch; if (ch == '#') T = NULL;//递归结束,建空树 else//递归创建二叉树 { T = new BiTNode;//生成根结点 T->data = ch;//根结点数据域置为ch CreateBiTree(T->lchild);//递归创建左子树 CreateBiTree(T->rchild);//递归创建右子树 } }
首先明确一个问题,一般使用指针进行传址,所以可以在函数中改变其值,这样在函数外这个地址中的数据也可以改变;然而函数的本质仍然是传值,只不过传指针传的是地址的值,所以如果对一个指针进行了改变,这时就需要使用二级指针或引用这个指针。
其次是这里的 BiTree &T ,在外面应该写作:
//BiTree T =new Node;//这里是为指针T开辟一块大小为结构体Node的空间 CreateBiTree(T);
这里传进来的是一个结构体的地址,所以 BiTree &T 的意思等价于 引用一个指针,所以函数传进来的参数为地址,这里还有另外一种写法,也就是使用二级指针。
然而既然是使用二级变量或者引用指针,那么必然是对这个指针指向的内容进行了改变,但是我一直觉得我并没有改变指针,只是对T的左右节点进行改变,所以一直使用单指针进行处理,一直报错。
但是实际上有这样一句:T = new BiTNode;//生成根结点
这句话在函数的作用域创建了空间,如果仅仅使用一个指针,那么这里为这个地址开辟了空间并给了值,但是函数结束了,这个空间也就释放了,所以这个指针中还是什么都没有。所以这里改变的实际上是地址,需要使用二级指针或引用指针。
我的理解是这样,有不对的请大家指正。