16 - 12 - 22 二叉树的基本操作

typedef struct node
{
    struct node *lchild,rchild;
    DataType data;
}*BiTree,BiNode;
BiTree *T;
/*初始化二叉树*/
void InitBiTree(BiTree *T)
{
    *T = NULL;
} 

/*先序递归创建二叉树*/
void CreateBiTree(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if(ch == '#')
        *T = NULL;  //这是Create函数的结尾。
    else{
    CreateBiTree(&(*T)->lchild);
    CreateBiTree(&(*T)->rchild);
    }
}

/*二叉树的销毁*/
void DestroyBiTree(BiTree *T)
{
    if(*T)
    {
        if((*T)->lchild)
            DestroyBiTree((*T)->lchild);
        if((*T)->rchild)
            DestroyBiTree((*T)->rchild);
        free(*T);
        *T = NULL;  //1、 不加行不行?
    }
}
//不行,T是指向这一片空间的,这片空间被释放后,
//还可以被别的项目利用,如果T仍然指向这里,会导致越界。
//初始化置空,使用完毕置空这是杜绝野指针的基本原则!

/*二叉树的左插入*/
/*p指向二叉树的某个结点,将子树 c 左插入p指向的的结点,
p原来的左子树变成c的右子树。*/
int InsertLeftChild(BiTree p, BiTree c)
{
    if(p){
        c->rchild = p->lchild;
        p->lchild = c;
        return 1;
    }
    return 0;  //说明:p = NULL
}

/*二叉树的右插入*/
int InsertRightChild(BiTree p,BiTree c)
{
    if(p){
        c->rchild = p->rchild;
        p->rchild = c;
        return 1;
    }
    return 0;
}

/*返回二叉树结点元素值为 e 的指针。
MAXSIZE是树的最大结点个数*/
BiTree BiTreePoint(BiTree T,DataType e)
{
    BiTree Q[MAXSIZE];   // 指针数组
    int front = 0,rear = 0;
    BiNode *p;
    if
    {
        Q[rear] = T;  //入栈
        rear++;
        while(front != rear )
        {
            p = Q[front];
            front++;
            if(p->data = e)
                return p;

            if(p->lchild)
                Q[rear++] = p->lchild;
            if(p->rchild)
                Q[rear++] = p->rchild;
        }
    }
    return NULL;
}
/*因为二叉树没有线索化,所以我们要考虑一种方法能走遍每(every)一个子节点
自然就需要指针分别向左指,再向右指。然后分别将向左指的指针入栈,向右指的指针入栈
这两个指针再分别重复以上故事。*/

/*返回数据域值为e的结点的左(右)孩子的数据域值*/
DataType LeftChild(BiTree *T)
{
    BiTree p;
    if(T){
        p = BiTreePoint(T,e);
        if( p && p->lchild)
            return p->lchild->data;
    }
    return 0;
}
DataType RightChild(BiTree *T)
{
    BiTree p;
    if(T){
        p = BiTreePoint(T,e);
        if( p && p->rchild)
            return p->rchild->data;
    }
    return 0;
}

/*删除二叉树的 p 所指的左(右)子树*/
int DeleteLeftChild(BiTree p)
{
    if(p){
        DestroyBiTree(&(p->lchild));
        return 1;
    }
    return 0;
}
int DeleteRightChild(BiTree p)
{
    if(p){
        DestroyBiTree(&(p-rchild));
        return 1;
    }
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值