首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

二叉树的结点的插入,该如何处理

2012-02-20 
二叉树的结点的插入#includeiostreamusingnamespacestdtypedefstructNode{chardatastructNode*lchild,

二叉树的结点的插入
#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那个函数里。。。。

热点排行