回覆列表
  • 1 # 使用者8154323242699

    檔案main.cpp程式碼如下:

    #include<malloc.h>//malloc()等

    #include<stdio.h>//標準輸入輸出標頭檔案,包括EOF(=^Z或F6),NULL等

    #include<stdlib.h>//atoi(),exit()

    #include<math.h>//數學函式標頭檔案,包括floor(),ceil(),abs()等

    #defineClearBiTreeDestroyBiTree//清空二叉樹和銷燬二叉樹的操作一樣

    typedefstructBiTNode

    {

    intdata;//結點的值

    BiTNode*lchild,*rchild;//左右孩子指標

    }BiTNode,*BiTree;

    intNil=0;//設整型以0為空

    voidvisit(inte)

    {printf("%d",e);//以整型格式輸出

    }

    voidInitBiTree(BiTree&T)

    {//操作結果:構造空二叉樹T

    T=NULL;

    }

    voidCreateBiTree(BiTree&T)

    {//演算法6.4:按先序次序輸入二叉樹中結點的值(可為字元型或整型,在主程中定義),

    //構造二叉連結串列表示的二叉樹T。變數Nil表示空(子)樹。修改

    intnumber;

    scanf("%d",&number);//輸入結點的值

    if(number==Nil)//結點的值為空

    T=NULL;

    else//結點的值不為空

    {T=(BiTree)malloc(sizeof(BiTNode));//生成根結點

    if(!T)

    exit(OVERFLOW);

    T->data=number;//將值賦給T所指結點

    CreateBiTree(T->lchild);//遞迴構造左子樹

    CreateBiTree(T->rchild);//遞迴構造右子樹

    }

    }

    voidDestroyBiTree(BiTree&T)

    {//初始條件:二叉樹T存在。操作結果:銷燬二叉樹T

    if(T)//非空樹

    {DestroyBiTree(T->lchild);//遞迴銷燬左子樹,如無左子樹,則不執行任何操作

    DestroyBiTree(T->rchild);//遞迴銷燬右子樹,如無右子樹,則不執行任何操作

    free(T);//釋放根結點

    T=NULL;//空指標賦0

    }

    }

    voidPreOrderTraverse(BiTreeT,void(*Visit)(int))

    {//初始條件:二叉樹T存在,Visit是對結點操作的應用函式。修改演算法6.1

    //操作結果:先序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次

    if(T)//T不空

    {Visit(T->data);//先訪問根結點

    PreOrderTraverse(T->lchild,Visit);//再先序遍歷左子樹

    PreOrderTraverse(T->rchild,Visit);//最後先序遍歷右子樹

    }

    }

    voidInOrderTraverse(BiTreeT,void(*Visit)(int))

    {//初始條件:二叉樹T存在,Visit是對結點操作的應用函式

    //操作結果:中序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次

    if(T)

    {InOrderTraverse(T->lchild,Visit);//先中序遍歷左子樹

    Visit(T->data);//再訪問根結點

    InOrderTraverse(T->rchild,Visit);//最後中序遍歷右子樹

    }

    }

    voidPostOrderTraverse(BiTreeT,void(*Visit)(int))

    {//初始條件:二叉樹T存在,Visit是對結點操作的應用函式

    //操作結果:後序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次

    if(T)//T不空

    {PostOrderTraverse(T->lchild,Visit);//先後序遍歷左子樹

    PostOrderTraverse(T->rchild,Visit);//再後序遍歷右子樹

    Visit(T->data);//最後訪問根結點

    }

    }

    voidmain()

    {

    BiTreeT;

    InitBiTree(T);//初始化二叉樹T

    printf("按先序次序輸入二叉樹中結點的值,輸入0表示節點為空,輸入範例:1200300\n");

    CreateBiTree(T);//建立二叉樹T

    printf("先序遞迴遍歷二叉樹:\n");

    PreOrderTraverse(T,visit);//先序遞迴遍歷二叉樹T

    printf("\n中序遞迴遍歷二叉樹:\n");

    InOrderTraverse(T,visit);//中序遞迴遍歷二叉樹T

    printf("\n後序遞迴遍歷二叉樹:\n");

    PostOrderTraverse(T,visit);//後序遞迴遍歷二叉樹T

    }

  • 中秋節和大豐收的關聯?
  • 周遊是個什麼梗?