二叉树的结点的插入
#include <iostream>
using namespace std;
typedef struct Node{
char data;
struct Node *lchild, *rchild;
}BinTNode;
typedef BinTNode *BinTree;
void IInsert(BinTree *T,char x)
{
bool found= false;
BinTNode *p=*T,*q;
while((p) && (!found))
{
q=p;
if(x==(p-> data)) found=true;
else if(x <(p-> data)) p=p-> lchild;
else p=p-> rchild;
}
if(!found)
{
p=new BinTNode;
p-> lchild=NULL;
p-> rchild=NULL;
p-> data=x;
if(*T)
{
if(x <(q-> data)) q-> lchild=p;
else q-> rchild =p;
}
else *T=p;
}
}
void Inorder(BinTree T)//中序遍历递归算法
{
if(T)
{
Inorder(T-> lchild);
cout < <T-> data < < "--> " < <endl;
Inorder(T-> rchild);
}
}
void InorderT(BinTree T)//中序遍历非递归算法
{
BinTree s[10];
int top=-1;
BinTree p=T;
while(top!=-1 || p!=NULL)
{
while(p!=NULL)
{
s[++top]=p;
p=p-> lchild;
}
if(top!=-1)
{
p=s[top--];
cout < <p-> data < < "--> ";
p=p-> rchild;
}
}
}
int main()
{
BinTree Head;
for(int i=0; i <10; ++i)
{
char ch;
cin> > ch;
IInsert(&Head,ch);
}
Inorder(Head);
InorderT(Head);
return 0;
}
可以编译通过,运行出错
[解决办法]
你这个是建的二叉搜索树吧?
先在main中建立一颗空树 BinTree root=NULL;
然后在insert函数中加个:if(root==nuul){//建立根接点}
else {//根据大小左右两边插入....}
[解决办法]
void IInsert(BinTree *T,char x)
{
bool found= false;
BinTNode *p=*T,*q;//T未初始化或者为NULL时都会出错
while((p) && (!found))//p未初始化时p的值是不为0的,但是p是不能被访问的,下面对p的访问会出错
{
q=p;
if(x==(p-> data)) found=true;
else if(x <(p-> data)) p=p-> lchild;
else p=p-> rchild;
}
if(!found)
{
p=new BinTNode;
p-> lchild=NULL;
p-> rchild=NULL;
p-> data=x;
if(*T)//T未初始化或者为NULL时都会出错
{
if(x <(q-> data)) q-> lchild=p;
else q-> rchild =p;
}
else *T=p;//T未初始化或者为NULL时都会出错
}
}
确保指针已经初始化并且不为空才能对其进行解引用- -
初始化指针,这是个好习惯,LZ那个函数里。。。。