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

来源:互联网 发布:java反编译工具 编辑:程序博客网 时间:2024/05/16 10:38
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;}
1 0
原创粉丝点击