c語言_二叉樹的建立以及3種遞歸


二叉樹c語言的實現

二叉樹的建立

  1. 二叉樹的數據結構

    typedef struct node
    {
       int data;
       struct node* left;
       struct node* right;
       /* data */
    } Node;
  2. 簡單創建節點

    int main() {
       Node n1;
       Node n2;
       Node n3;
       Node n4;

       n1.data = 5;
       n2.data = 6;
       n3.data = 7;
       n4.data = 8;
       //這時候節點沒有連接起來   對節點進行連接
       n1.left = &n2; //n2是一個數據實體 而left需要是一個指針 取n2的地址拼到n1的左邊上去
       n1.right = &n3;
       n2.left = &n4;
       n2.right = NULL; //即使沒東西也要 給出NULL
       n3.left = NULL;
       n3.right = NULL;
       n4.left = NULL;
       n4.right = NULL;
       //創建成功
       //先序遍歷驗證
       preorder(&n1);//放入一個指針地址 作為頭節點
    }
  3. 通過遍歷樹來確認是否是一個真正的二叉樹

    //先序遍歷 遞歸
    void preorder(Node* node){
    if(node != NULL){
    printf("%d\n",node -> data);
           preorder(node -> left);
           preorder(node -> right);
    }
    }
  4. 輸出結果

  5. 中序和后續遍歷

    //中序遍歷 遞歸
    void inorder(Node* node){
    if(node != NULL){

           inorder(node -> left);
           printf("%d\n",node -> data);
           inorder(node -> right);
    }
    }
    //后序遍歷 遞歸
    void postorder(Node* node){
    if(node != NULL){
           postorder(node -> left);
           postorder(node -> right);
           printf("%d\n",node -> data);
    }
    }
  6. 改寫創建樹的代碼

    void createBiTree(BiTree *T)
    {
    char ch;
    scanf ("%c", &ch); //如果是字符型 %c 回車輸入 算一個字符,ubutun會一直遞歸
    if (ch == '#')//擴展二叉樹,虛結點 == 0
    {
    *T = NULL;
    }
    else
    {
    *T = (BiTree )malloc(sizeof(BiTNode)); //!!! stdlib.h 頭文件一定要加!!!
    if (!*T)
    {
    exit(-1); //錯誤退出
    }
    (*T)->data = ch; //生成根結點
    createBiTree(&((*T)->lchild)); //構造左子樹
    createBiTree(&((*T)->rchild)); //構造右子樹
    }
    }
  7. 最終代碼

    #include <stdio.h>
    #include <stdlib.h>

    typedef char ElemType; //這里用int 作為樹結點的數據

    typedef struct BiTNode
    {
    ElemType data;
    struct  BiTNode *lchild, *rchild; //左右孩子指針
    }BiTNode, *BiTree;

    void createBiTree(BiTree *T); //創建樹
    void preOrderTraverse(BiTree T); //前序遍歷
    void inOrderTraverse(BiTree T); //中序遍歷
    void postOrderTraverse(BiTree T); //后序遍歷

    int main()
    {
    BiTree T = NULL;
    createBiTree(&T);
    preOrderTraverse(T);
    printf("\n");
    inOrderTraverse(T);
    printf("\n");
    postOrderTraverse(T);
    return 0;
    }

    void createBiTree(BiTree *T)
    {
    char ch;
    scanf ("%c", &ch); //如果是字符型 %c 回車輸入 算一個字符,ubutun會一直遞歸
    if (ch == '#')//擴展二叉樹,虛結點 == 0
    {
    *T = NULL;
    }
    else
    {
    *T = (BiTree )malloc(sizeof(BiTNode)); //!!! stdlib.h 頭文件一定要加!!!
    if (!*T)
    {
    exit(-1); //錯誤退出
    }
    (*T)->data = ch; //生成根結點
    createBiTree(&((*T)->lchild)); //構造左子樹
    createBiTree(&((*T)->rchild)); //構造右子樹
    }
    }

    void preOrderTraverse(BiTree T)
    {
    if (NULL == T)
    {
    return;
    }
    printf("%c", T->data); //顯示結點數據,可以改成其他對結點的操作
    preOrderTraverse(T->lchild); //再先序遍歷左子樹
    preOrderTraverse(T->rchild); //最后先序遍歷右子樹
    }

    void inOrderTraverse(BiTree T)
    {
    if (NULL == T)
    {
    return;
    }
    inOrderTraverse(T->lchild); //中序遍歷左子樹
    printf("%c", T->data); //顯示結點數據,可以改成其他對結點的操作
    inOrderTraverse(T->rchild); //最后再中序遍歷右子樹
    }

    void postOrderTraverse(BiTree T)
    {
    if (NULL == T)
    {
    return;
    }
    postOrderTraverse(T->lchild); //先后序遍歷左子樹
    postOrderTraverse(T->rchild); //再后序遍歷右子樹
    printf("%c", T->data); //顯示結點數據,可以改成其他對結點的操作
    }
  8. 輸入數據

    ABDG##H###CE#I##F##

  9. 輸出數據

  10.  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM