二叉树

作者: 始于尘埃 | 来源:发表于2019-08-10 22:02 被阅读0次
    //树的基本遍历
    #include <stdio.h>
    #include <stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    #define OVERFLOW -2
    #define OK 1
    #define ERROR 0
    
    typedef int Status;
    typedef int TElemType;
    
    /*
     * 存储结构
     */
    typedef struct BiTNode
    {
        TElemType data;    //数据
        struct BiTNode *lchild, *rchild;
    }BiTNode, *BiTree;
    
    /*
     * 创建二叉树,输入0表示创建空树
     */
    Status CreateBiTree(BiTree *T) //T为指针的指针 
    {
        TElemType e;
        scanf("%d", &e);
        if (e == 0)
        {
            *T = NULL;
        }
        else
        {
            *T = (BiTree) malloc(sizeof(BiTNode));
            if (!T)
            {
                exit(OVERFLOW);
            }
            (*T)->data = e;
            CreateBiTree(&(*T)->lchild);    //创建左子树
            CreateBiTree(&(*T)->rchild);    //创建右子树
        }
        return OK;
    }
    
    /*
     * 访问元素
     */
    void visit(TElemType e)
    {
        printf("%d ", e);
    }
    
    /*
     * 先序遍历二叉树:指先访问根,然后访问孩子的遍历方式
     */
    Status PreOrderTraverse1(BiTree T)
    {
        if (T)
        {
            
            //visit(T->data);
            PreOrderTraverse1(T->lchild);
            printf("%d",T->data);
            PreOrderTraverse1(T->rchild);
        }
    }
    Status PreOrderTraverse(BiTree T, void (*visit)(TElemType))
    {
        if (T)
        {
            visit(T->data);
            PreOrderTraverse(T->lchild, visit);
            PreOrderTraverse(T->rchild, visit);
        }
    }
    
    /*
     * 中序遍历二叉树:指先访问左(右)孩子,然后访问根,最后访问右(左)孩子的遍历方式
     */
    Status InOrderTraverse(BiTree T, void (*visit)(TElemType))
    {
        if (T)
        {
            InOrderTraverse(T->lchild, visit);
            visit(T->data);
            InOrderTraverse(T->rchild, visit);
        }
    }
    
    /*
     * 后序遍历二叉树:指先访问孩子,然后访问根的遍历方式
     */
    Status PostOrderTraverse(BiTree T, void (*visit)(TElemType))
    {
        if (T)
        {
            PostOrderTraverse(T->lchild, visit);
            PostOrderTraverse(T->rchild, visit);
            visit(T->data);
        }
    }
    
    int main()
    {
        BiTree T;
        printf("创建树,输入0为空树:\n");
        CreateBiTree(&T);
        printf("先序遍历:");
        PreOrderTraverse1(T);
        
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:二叉树

          本文链接:https://www.haomeiwen.com/subject/vvudjctx.html