当前位置: 代码迷 >> 综合 >> 二叉树创建函数中一定要用指针的引用void createtree(BiTree *T)或者用指针的指针void createtree(BiTree **T)
  详细解决方案

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

热度:34   发布时间:2023-12-06 07:03:53.0

 如果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");

}














  相关解决方案