树的数据结构
typedef struct Bnode
{ int data;
struct Bnode *Lson, *Rson;
} Bnode, *Bptr;
记录当前结点孩子的个数
void child(Bptr p,int t)//记录当前结点孩子的个数
{
if(p==NULL || found==3)return;
//如果是没有孩子,或者已经访问过就返回
if(found==1) sum++;
//如果结点访问次数为1,sum++ //意味着 搜索到一个孩子
if(p->data==t) {found=1} //如果找到当前结点,
child(p->Lson,t);//递归记录当前结点的左孩子个数
child(p->Rson,t);//递归记录当前结点的右孩子个数
if(p->data==t) found=3;
// 访问次数为3 已经该子树已经访问结束。
}
交换两棵树的所有子树
Bptr exchange(Bptr p)
{
Bptr x;
if(!p) return 0; //如果结点不存在,就返回
x=p->Lson; //把左子树的指针给x
p->Lson=p->Rson;//把右子树的指针给左子树
p->Rson=x; //把x的指针给右子树
//实质就是把结点p的左右子树指针交换
exchange(p->Lson); //递归交换下层左子树
exchange(p->Rson); //递归交换下层右子树
}
输出某一指定结点的真祖先
void ancestor(Bptr p,int t) //输出某一指定结点的真祖先
{
if(p==NULL) return;//如果结点不存在,就返回
if(p->data==t) //如果找到指定结点
{
foundb=1; //访问标记置1
return;
}
ancestor(p->Lson,t);//递归搜索左子树
if(foundb==1) //如果已经标记访问
{
printf("%d\n",p->data);
//输出当前结点,因为当前结点是真祖先
return;
}
ancestor(p->Rson,t) //递归搜索右子树
if(foundb==1) //如果已经标记访问
{
printf("%d\n",p->data);
//输出当前结点,因为当前结点是真祖先
return;
}
}
删除单叶结点
void delete(Bptr p) //删除单叶结点
{
if(p==NULL) return 0;
if((p->Lson==NULL&&p->Rson!=NULL)||
(p->Lson!=NULL&&p->Rson==NULL))
return 1;
//如果是单叶结点,则return 1
if(delete(p->Lson)==1) p->Lson=NULL;
//如果左子树返回1,则删除左子树
if(delete(p->Rson)==1) p->Rson=NULL;
//如果右子树返回1,则删除右子树
}
括号表示法输出树结构
void toot(Bptr p) //输出树的结构的,用括号表示法
{
if(p == NULL) //如果p结点为空,则输出*
{
printf("*");
return;
}
if(p ->Lson == NULL && p ->Lson == NULL) //如果是单叶结点
{
printf("%d", p -> data); //直接输出根结点值 ,返回
return ;
}
printf("%d(", p -> data); //先输出结点值
toot(p -> Lson); //然后输出递归进行左子树
printf(",");
toot(p -> Rson); //递归进行右子树
printf(")");
}
网友评论