二叉树创建函数中一定要用指针的引用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");
}
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");
}
相关文章推荐
- 二叉树的创建--(2)运算符重载<<、>>以及CreateBinaryTree、Traverse、PrintBTree函数
- error: 函数调用缺少参数列表;请使用“&BinTree<char>::_PrintNode”创建指向成员的指针
- c++:函数传指针(void * xx)、传引用(void & xx)和传指针的引用(void *& xx)
- C/C++之函数返回值为指针或者是引用时常见错误总结
- C++ 常量指针或者常量引用作为函数参数传递的原因
- 函数名称前面加引用“&”或指针符号“*”的意思
- 关于函数不能返回局部对象的引用或者局部对象的指针
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- C++函数的传值调用&指针调用&引用调用
- [CareerCup] 4.4 Create List at Each Depth of Binary Tree 二叉树的各层创建链表
- 函数 千万不要返回“局部对象”的引用或者指针
- php的引用&(就是在变量或者函数、对象等前面加上&符号)
- ”引用 & 指针“ -- 作为函数的参数和返回值小结
- php的引用(就是在变量或者函数、对象等前面加上&符号)
- php的引用(就是在变量或者函数、对象等前面加上&符号)
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- error C3867: “Point::getX”: 函数调用缺少参数列表;请使用“&Point::getX”创建指向成员的指针
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- static函数 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针;类的static成员函数
- C++函数的传值调用&指针调用&引用调用