树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。
二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。
二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:
//二叉树结点
typedef struct BiTNode{
//数据
char data;
//左右孩子指针
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
删除的代码
int Delete(BiTree *p)//这段代码是处理其子结点,因为删除的时候可能删除的不是叶结点,所以就要进行嫁接···
{
BiTree q,s;
if(!(*p)->rchild)
{ //右子树为空 重接它的左子树
q=*p;
*p=(*p)->lchild;
free(q);
}
else
{
if(!(*p)->lchild)
{ //若左子树空 则重新接它的右子树
q=*p;
*p=(*p)->rchild;
}
else
{//若都不为空
q=*p;
s=(*p)->lchild;
while(s->rchild)
{ //转左 然后向右到尽头
q=s; s=s->rchild;
}
(*p)->data=s->data; //s指向被删除结点的前驱
if(q!=*p)
q->rchild=s->lchild; //重接q的右子树
else
q->lchild=s->lchild;//重接q的左子树
free(s);
}
}
return 1;
}
//在T中 删除key元素
int DeleteBST(BiTree *T,int key)//这一段就是单单指的删除的数据,并不处理其因删除结点而留下的问题
{
if(!*T) return 0;
else
{
//如果成功找到 就删除
if(key==(*T)->data) return Delete(T);
else
{