首先在寫二叉樹時遇到一個問題: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