如果Create的参数不是指针的引用,
main中 Create(T)是把指针T指向的地址传进去了. 注意,只是地址.
然后你在Create函数内部申请内存时, 把这个地址给改变了, 但是因为你传的是一个地址, 这个地址本身跟T无关,T仅仅是指向了这个地址而以. 所以Create(T)之后, T还是指向原来的地址,并未改变。
如果main函数里是:BiTree *T; 那么经过createtree(T);之后,T还是那个没有初始化的T,报错
如果main函数里是:BiTree *T=(BiTree*)malloc(sizeof(BiTree)); 那么经过createtree(T);之后,T还是原来那个T,报错
所以,要想指针T的值经过createtree()之后就能改变的话,那么一定要用createtree(*&T),
或者createtree(**T)
贴代码:
#include <stdio.h>
#include <iostream>typedef struct bitree
{
char data;
struct bitree* left;
struct bitree* right;
}BiTree,*pBiTree; //这两个名字不要一样!否则会出错
//递归法创建二叉树
void createtree(BiTree *&T) //这里一定要用引用!!,把那个根节点直接传进来
{
T = (BiTree*)malloc(sizeof(BiTree));
char data;
std::cin >> data;
if ('#' == data)
T=NULL;
if(T)
{
T->data = data;
std::cout << "输入" << data << "的左子节点\n";
createtree(T->left);
std::cout << "输入" << data << "的右子节点\n";
createtree(T->right);
}
}
//递归前序遍历输出二叉树,即根->左->右,VLRvoid preorder(BiTree *T)
{
if (T!=0)
{
std::cout << T->data;
std::cout<<" ";
preorder(T->left);
preorder(T->right);
}
}
//递归中序遍历输出二叉树
void inorder(BiTree *T)
{
if (T)
{
preorder(T->left);
std::cout << T->data;
std::cout << " ";
preorder(T->right);
}
}
//递归后序遍历输出二叉树
void postorder(BiTree *T)
{
if (T)
{
preorder(T->left);
preorder(T->right);
std::cout << T->data;
std::cout << " ";
}
}
int main()
{
std::cout << "请输入树的节点,按#结束:\n";
BiTree *T=(BiTree*)malloc(sizeof(BiTree)); //这里不用再分配内存了,分配内存也没事,浪费一点而已,T可以不用初始化,形参用引用就行!
createtree(T);
std::cout << "前序遍历二叉树结果为:\n";
preorder(T);
std::cout << "\n";
std::cout << "中序遍历二叉树结果为:\n";inorder(T);
std::cout << "\n";
std::cout << "后序遍历二叉树结果为:\n";postorder(T);
std::cout << "\n";
system("pause");}