二叉樹的創建,先中后序輸出,計算葉子結點數目


#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct BiTNode
{
    char data;
    struct BiTNode *l;
    struct BiTNode *r;
} BiTNode,*BiTree;
void CreatBiTree(BiTree &T)
{
    ///按先序次序輸入二叉樹中結點的值(一個字符),創建二叉鏈表表示的二叉樹T;
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        T=NULL;
    else
    {
        T=new BiTNode;
        T->data=ch;
        CreatBiTree(T->l);
        CreatBiTree(T->r);
    }
}
void PreOrderTraverse(BiTree T)///先序遍歷二叉樹
{
    if(T)
    {
        printf("%c",T->data);
        PreOrderTraverse(T->l);
        PreOrderTraverse(T->r);
    }
}

void MidOrderTraverse(BiTree T)///中序遍歷二叉樹
{
    if(T)
    {
        MidOrderTraverse(T->l);
        printf("%c",T->data);
        MidOrderTraverse(T->r);
    }
}
void AfOrderTraverse(BiTree T)///后序遍歷二叉樹
{
    if(T)
    {
        AfOrderTraverse(T->l);
        AfOrderTraverse(T->r);
        printf("%c",T->data);
    }
}
int Count(BiTree T){ //計算葉子結點的數目(利用遞歸)
    if(T== NULL){
        return 0;
    }
    else if ((T->l==NULL) && (T->r==NULL)){
        return 1;
    }
    else{
        return Count(T->l)+Count(T->r);
    }
}
int main()
{
    BiTree T;
    CreatBiTree(T);
    printf("先序遍歷為\n");
    PreOrderTraverse(T);
    printf("\n");
    printf("中序遍歷為\n");
    MidOrderTraverse(T);
    printf("\n");
    printf("后序遍歷為\n");
    AfOrderTraverse(T);
    printf("\n");
    printf("輸出葉子結點數:%d\n",Count(T));
    return 0;
}

 

(首先用#號填充,使二叉樹的葉子結點全部為#)

輸入:AB#CD##E##F#GH###

輸出見下圖:

計算二叉樹的所有葉子節點的數量:

當一個節點的左孩子和右孩子都為空時,它是葉子節點。

使用遞歸如果能找到就返回1,如果節點為NULL返回0,否則返回count(t->lchild)+ count(t->rchild)


免責聲明!

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



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