您的位置:首页 > 其它

二叉树创建函数中一定要用指针的引用void createtree(BiTree *&T)或者用指针的指针void createtree(BiTree **T)

2017-10-01 22:01 302 查看
 如果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);
}

}

//递归前序遍历输出二叉树,即根->左->右,VLR

void 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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐