问题描述
- 数据结构问题。二叉树,程序写了编译没错,但没办法运行。求大神看下。
-
#include
#define MAXLEN 100
using namespace std;
typedef char elementType;
typedef struct lBnode
{elementType data;
struct lBnode *lchild,*rchild;
}Binode,*Bitree;void create(Bitree &T) //创建二叉链表
{char ch;
cin>>ch;
if(ch=='#')
T=NULL;
else
{T=new Binode;
T->data=ch;
create(T->lchild);
create(T->rchild);}
}void preorder(Bitree T) //先序遍历
{if(T)
{cout<data;
preorder(T->lchild);
preorder(T->rchild);}
}void inorder(Bitree T) //中序遍历
{if(T)
{
inorder(T->lchild);
cout<data;
inorder(T->rchild);}
}void postorder(Bitree T) //后序遍历
{if(T)
{
postorder(T->lchild);
cout<data;
postorder(T->rchild);}
}int depth(Bitree T) //高度
{int h,hl,hr;
if(!T) h=0;
else
{hl=depth(T->lchild);
hr=depth(T->rchild);
h=hl>hr?hl+1:hr+1;}
return h;}void countleaf(Bitree T,int &n) //叶子节点个数
{if(T)
{if(!T->lchild&&T->rchild)
n++;
countleaf(T->lchild,n);
countleaf(T->rchild,n);}
}void main()
{Binode *T;
int n;
create(T);
cout<<"先序遍历序列:";
preorder(T);
cout<<"中序遍历序列:";
inorder(T);
cout<<"后序遍历序列:";
postorder(T);
cout<<"二叉树的深度为:";
depth(T);
cout<<"叶子节点的个数为:";
countleaf(T,n);
}我就不懂了,为什么创建二叉链表的时候不进入那个子函数,让我输入字符呢?好郁闷。能帮我看看么?
解决方案
你定义的T可能指向一个不可用的内存空间,赋值为null试试呢~
解决方案二:
#include
#define MAXLEN 100
using namespace std;
typedef char elementType;
typedef struct lBnode
{
elementType data;
struct lBnode *lchild,*rchild;
}Binode,*Bitree;
void create(Bitree &T) //创建二叉链表
{
cout<
cout
char ch;
cin>>ch;
if(ch == '#')
{
T=NULL;
return; //递归必须有结束函数的项目,不然就会无限循环。
}
else
{
T = new Binode;
T->data=ch;
create(T->lchild);
create(T->rchild);
}
}
void preorder(Bitree T) //先序遍历
{
if(T)
{
cout<data;
preorder(T->lchild);
preorder(T->rchild);
}
}
void inorder(Bitree T) //中序遍历
{
if(T)
{
inorder(T->lchild);
cout<data;
inorder(T->rchild);
}
}
void postorder(Bitree T) //后序遍历
{
if(T)
{
postorder(T->lchild);
cout<data;
postorder(T->rchild);
}
}
int depth(Bitree T) //高度
{
int h,hl,hr;
if(!T)
h=0;
else
{
hl=depth(T->lchild);
hr=depth(T->rchild);
h=hl>hr?hl+1:hr+1;
}
return h;
}
void countleaf(Bitree T,int &n) //叶子节点个数
{
if(T)
{
if(!T->lchild&&T->rchild)
n++;
countleaf(T->lchild,n);
countleaf(T->rchild,n);
}
}
void main()
{
Binode *T = NULL;//初始化为NULL,避免出现野指针
int n;
cout<<1<<endl;//辅助查看是否进入子函数
create(T);
cout<<2<<endl;//辅助查看是否进入子函数
cout<<"先序遍历序列:";
preorder(T);
cout<<"中序遍历序列:";
inorder(T);
cout<<"后序遍历序列:";
postorder(T);
cout<<"二叉树的深度为:";
depth(T);
cout<<"叶子节点的个数为:";
countleaf(T,n);
}
与你的程序对比,其实已经进入子函数了。你应当注意以下问题:
1. 程序野指针问题
2. 递归相关问题
3. 程序中还有一些小问题,比如敲写代码错误。
仔细看看相关的书籍,会对你有很大的帮助。
解决方案三:
好高深的样子,c与c++请务必记得初始化!初始化才会有内存分配。否则啥问题都可能出现。