文章标题

来源:互联网 发布:linux认证工程师 编辑:程序博客网 时间:2024/06/05 11:28

重点内容 二叉树的建立与遍历
强调内容 递归算法和指针引用

//递归函数的调用#include<stdio.h>#include<math.h>#include<stdlib.h>#define ERROR 1typedef struct BiTNode{    char data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;typedef int Status;Status CreateBiTree(BiTree &T){//构造二叉树,按先序次序输入二叉树中结点的值,空格字符表示空树    char ch;    scanf("%c", &ch);    if (ch == ' ') T = NULL;    else    {        if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))  exit(OVERFLOW);        T->data = ch;               //生成根结点        CreateBiTree(T->lchild);    //构造左子树        CreateBiTree(T->rchild);    //构造右子树    }    return 0;}//CreateBiTreeStatus PreOrderTraverse(BiTree T){//先序遍历二叉树T,对于每个结点调用visit函数一次    if (T)    {        printf("%c",T->data); //visit函数最简单形式        if (PreOrderTraverse(T->lchild))            if (PreOrderTraverse(T->rchild))  return 0;            return ERROR;    }    else return 0;}//PreOrderTraverseStatus InOrderTraverse(BiTree T){//中序遍历二叉树T,对于每个结点调用visit函数一次    if (T)    {        if (T->lchild) InOrderTraverse(T->lchild);        printf("%c", T->data);        if (T->rchild) InOrderTraverse(T->rchild);    }    return 0;}//InOrderTraverseStatus PostOrderTraverse(BiTree T){//后序遍历二叉树T,对于每个结点调用visit函数一次    if (T)    {        if (T->lchild) PostOrderTraverse(T->lchild);        if (T->rchild) PostOrderTraverse(T->rchild);        printf("%c", T->data);    }    return 0;}//PostOrderTraverseStatus DeepBiTree(BiTree T){//求二叉树高度    int l = 0, r = 0;    if (T == NULL) return 0;    else        if (T->lchild == NULL && T->rchild == NULL) return 1;        else{            l = DeepBiTree(T->lchild) + 1;            r = DeepBiTree(T->rchild) + 1;            return (l>r ? l : r);        }}//HighBiTreeStatus LeafBiTree(BiTree T){//求二叉树的叶子结点    if (T == NULL) return 0;    else        if (T->lchild == NULL && T->rchild == NULL) return 1;        else return (LeafBiTree(T->lchild) + LeafBiTree(T->rchild));}//LeafBiTreeStatus Parent(BiTree T, char son){    //查找指定结点的双亲,从根节点开始    if (T == NULL) return 0;    if (((T->lchild) && (T->lchild->data == son)) ||((T->rchild) && (T->rchild->data == son))){        printf("该结点的双亲为:%c\n",T->data);        return 0;    }    else{        Parent(T->lchild, son);        Parent(T->rchild, son);        return 0;    }}Status Borther(BiTree T, char borther){    //查找指定节点的兄弟,从根节点开始    if (T == NULL) return 0;    if ((T->lchild) && (T->lchild->data == borther)){        if (T->rchild){            printf("该节点的兄弟为:%c\n",T->rchild->data);        }        else{            printf("该节点没有兄弟节点");        }        return 0;    }    else if((T->rchild) && (T->rchild->data == borther)){        if (T->lchild){            printf("该节点的兄弟为:%c",T->lchild->data);        }        else{            printf("该节点没有兄弟节点");        }        return 0;    }    else{        Borther(T->lchild, borther);        Borther(T->rchild, borther);        return 0;    }}void main(){    int n;    BiTNode *T;    do{        printf("\n");        printf("**********二叉树的基本操作及应用*****************\n");        printf("*1  创建                                  *\n");        printf("*2  遍历                                  *\n");        printf("*3  计算树的深度及叶子结点的个数          *\n");        printf("*4  查找双亲                                *\n");        printf("*5  查找兄弟                                *\n");        printf("*6  退出                                  *\n");        printf("*************************************\n");        printf("请选择:");        scanf("%d", &n);        switch(n){        case 1:            getchar();            printf("请先序输入二叉树的结点,空格表示空树\n");            CreateBiTree(T);            printf("创建成功");            break;        case 2:            printf("先序遍历:");            PreOrderTraverse(T);            printf("\n");            printf("中序遍历:");            InOrderTraverse(T);            printf("\n");            printf("后序遍历:");            PostOrderTraverse(T);            printf("\n");            break;        case 3:            printf("树的深度为:%d\n",DeepBiTree(T));            printf("叶子结点的个数为:%d",LeafBiTree(T));            getchar(); getchar();            break;        case 4:            char son;            printf("请输入需要查询的节点:");            getchar();            scanf("%c",&son);            Parent(T, son);            break;        case 5:            char borther;            printf("请输入需要查询的节点:");            getchar();            scanf("%c",&borther);            Borther(T, borther);            break;        case 6: break;        default:            printf("ERROR!"); break;        }    }while(n!=6);}
0 0