用c語言實現前序創建二叉樹(遞歸),分別用前序,中序,后序遍歷,以及分別輸出節點個數和葉子節點個數


本人c語言小白一枚,近期在學習數據結構(c語言版),特寫此隨筆,做一些總結和分享,如有不當之處,請各位技術大牛指點

首先我們用一個結構體來抽象樹的結點,代碼如下(這里我們存放的數據為char型,大家可以根據自己不同的數據來自己定義,也可以在一開始用typedef特別定義一個類型,接下來就是兩個指針,

用來指向左兒子和右兒子)

struct tnode{
    char data;
    struct tnode *lchild,*rchild;
};

 

一,如何前序創建一顆二叉樹

首先簡述一下前序創建二叉樹的算法:其實前序創建一顆二叉樹的算法非常簡單,這里我們要用到遞歸的思想,先給根節點賦值,然后再依次給左子樹的根節點和右子樹的根節點賦值,用遞歸的思想將整顆樹賦值。(在這里我們用‘#’來表示某個結點為空),代碼如下:

struct tnode * creatTree(struct tnode *head){
    char e;
    scanf("%c",&e);
    fflush(stdin);
    if(e != '#'){
         head = (struct tnode *)malloc(sizeof(struct tnode));//先開辟空間
         head ->data = e;//判斷不是'#'后,給根節點賦值
         head ->lchild = NULL;
         head ->rchild = NULL;
      //依次把左兒子和右兒子調用該方法進行賦值 head
->lchild = creatTree(head->lchild); head ->rchild = creatTree(head->rchild); } return head; }

這樣我們就可以成功創建一顆二叉樹

二,前序遍歷二叉樹

簡述一下前序遍歷二叉樹的算法:(這里同樣也要用到遞歸的思想),首先拜訪頭結點,然后拜訪左子樹,再拜訪右子樹,代碼如下:

void preorderTree(struct tnode *head){
    //先拜訪頭結點
    printf("%c",head->data);
    //再走左子樹
    if(head->lchild != NULL){//判斷左子樹是不是為空
         preorderTree(head->lchild);
    }
    if(head ->rchild !=NULL){//判斷右子樹是不是為空
        //再走右子樹
        preorderTree(head->rchild);

    }
    return;
}

三,后序遍歷二叉樹:

和前序遍歷二叉樹類似,只是我們要最后拜訪根節點,同樣用到了遞歸的思想,代碼如下:

void postorderTree(struct tnode *head){
    //先左子樹
    if(head->lchild != NULL){
        postorderTree(head->lchild);
    }

    //再右子樹

    if(head->rchild != NULL){
        postorderTree(head->rchild);
    }
    //最后根節點
    printf("%c",head->data);
    return;
}

四,中序遍歷二叉樹:

和前兩種類似,我們先拜訪左子樹,再拜訪根節點,最后拜訪右子樹,(同樣用到了遞歸的思想)代碼如下:

 

void inorderTree(struct tnode *head){


    //先走左子樹
    if(head->lchild !=NULL){
        inorderTree(head->lchild);
    }
    //再走頭結點
    printf("%c",head->data);

     //再走右子樹
    if(head->rchild != NULL){
        inorderTree(head->rchild);
    }

    return;
}

 

 

 

五,輸出節點的個數

思路:我們先在main函數里面定義一個計數器,在遍歷的過程中,只要節點不是null,我們就讓這個計數器++,這樣就可以實現記錄節點個數的功能啦,(在這里我們同樣又用到了遞歸的思想,遞歸真的好重要的,到處都是遞歸),代碼如下:(這里特別要注意的地方就是我們在main函數里面定義的計數器,一定要把地址給我們的函數,所以我們函數里面的形參是個int型的指針)

int sumNode(struct tnode *head,int *count){
    if(head == NULL){//判斷根節點是否為空
        return *count + 0;
    }else{
        //在這里我們用的是前序遍歷二叉樹的思想,先走根節點,在走左右子樹
        *count += 1;
        sumNode(head->lchild,count);
        sumNode(head->rchild,count);
    }
    return *count;
}

 

六,輸出葉子節點的個數

int leaf(struct tnode * root)
{
    if (root == NULL)//如果根節點為空,則返回空
        return 0;
    else if (root->lchild == NULL&&root->rchild == NULL)//如果左孩子和右孩子同時為空,則葉子節點的數加+1
        return 1;
    else
        return leaf(root->lchild) + leaf(root->rchild);//一棵樹的葉子節點由它的左孩子和右孩子的葉子節點決定的。

}

 

 

以上就是全部內容,如有疑問和您的寶貴建議,盡情可以在評論中留言

 

 

 

 

---恢復內容結束---


免責聲明!

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



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