二叉樹的創建,遍歷以及葉子結點數


首先在寫二叉樹時遇到一個問題:scanf和輸入緩沖區以及getchar和輸入緩沖區之間關系

scanf是讀入一個字符,而你在輸入時實際上輸入的是:某個字符+Enter,Enter 產生的\n 也會停留在輸入緩沖區中,下次調用 scanf %c 時就會直接讀到它而不是等待你再次輸入!

對於這個問題找到了兩種解決方式,我自己也嘗試了

(1)scanf(" %c", &ch); //(前邊添加一個空格)消除上一個'/n',因為遇到空格,TAB或回車作間即認為該數據結束。

(2)不加空格情況下,可以在后面加上getchar()一句,getchar是從輸入緩沖區讀取一個字符,所以讀取是scanf輸入留下的換行符‘/n‘

本次建立二叉樹采用遞歸創建,

葉子結點數:當一個結點的左孩子和右孩子都為空時。他是葉子結點。使用遞歸如果能找到就返回1,如果節點為NULL返回0,否則返回count(t->lchild)+ count(t->rchild)

程序:

#include <stdio.h>
#include <stdlib.h>
//定義結二叉樹的構體  
typedef struct BTree
{
    char  data;
    struct BTree *lChild;
    struct BTree *rChild;
}BinTree;


//二叉樹的創建  
 BinTree* CreateTree(BinTree *T)
{
    char temp;
   scanf(" %c", &temp); //注意這里前面為什么加一個空格,因為scanf輸入形式是實際上輸入的是:某個字符+Enter,Enter 產生的\n 也會停留在輸入
緩沖區中,下次調用 scanf %c 時就會直接讀到它而不是等待你再次輸入! 所以加入空格是為了消除上次輸入留下的'/n'
        //getchar();  //這句也是可以消除上面的問題,當上面不加空格時,加上這句也可以,因為getchar是從輸入緩沖區讀取一個字符,所以讀取是scanf輸入留下的換行符‘/n’
    if(temp == '@'){
                T=NULL;
        }else{
                 T = (BinTree *)malloc(sizeof(BinTree));
                 T->data = temp;
                 printf("輸入%c的左孩子:",temp);
                 T->lChild = CreateTree(T->lChild);//遞歸創建左子數
                 printf("輸入%c的右孩子:",temp);
                 T->rChild = CreateTree(T->rChild);
             }
    return T;
}

//先序遍歷二叉樹  
void PreOrderTraverse(BinTree *T)
{
    if(T)
    {
        printf("%c", T->data);
        PreOrderTraverse(T->lChild);
        PreOrderTraverse(T->rChild);
    }
}
//中序遍歷二叉樹  
void InOrderTraverse(BinTree *T)
{
    if(T)
    {
        InOrderTraverse(T->lChild);
        printf("%c", T->data);
        InOrderTraverse(T->rChild);
    }
}
//后序遍歷二叉樹  
void PostOrderTraverse(BinTree *T)
{
    if(T)
    {
        PostOrderTraverse(T->lChild);
        PostOrderTraverse(T->rChild );
        printf("%c",T->data );
   }
}

//葉子結點數

int Count(BinTree * T){
    if(T == NULL){
        return 0;
    }
    else if ((T->lChild==NULL) && (T->rChild==NULL)){
        return 1;
    }
    else{
        return Count(T->lChild)+Count(T->rChild);
    }
}
int main()
{
    BinTree *Tree;
    printf("輸入root:");
    Tree = CreateTree(Tree);
    printf("=========分隔符============\n\n");
    printf("二叉樹的先序遍歷:\n");
    PreOrderTraverse(Tree);
    printf("\n");
    printf("二叉樹的中序遍歷:\n");
    InOrderTraverse(Tree);
    printf("\n");
    printf("二叉樹的后序遍歷:\n");
    PostOrderTraverse(Tree);
    printf("\n");
    printf("\n=========================\n");
    return 0;
}
結果:

android@android-Latitude-E4300:~/work/c/erchashu$ ./jiedian

輸入root:a
輸入a的左孩子:b
輸入b的左孩子:c
輸入c的左孩子:@
輸入c的右孩子:@
輸入b的右孩子:d
輸入d的左孩子:@
輸入d的右孩子:@
輸入a的右孩子:e
輸入e的左孩子:@
輸入e的右孩子:@
=========分隔符============

二叉樹的先序遍歷:
abcde
二叉樹的中序遍歷:
cbdae
二叉樹的后序遍歷:
cdbea

=========================
葉子節點的個數: 3




                                                                                                                   82,3          Bot



免責聲明!

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



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