二叉樹葉子個數

power_to_go發表於2016-08-08
資料結構實驗之二叉樹七:葉子問題
Time Limit: 1000MS Memory limit: 65536K
題目描述
已知一個按先序輸入的字元序列,如abd,,eg,,,cf,,,(其中,表示空結點)。請建立該二叉樹並按從上到下從左到右的順序輸出該二叉樹的所有葉子結點。

輸入
輸入資料有多行,每一行是一個長度小於50個字元的字串。
輸出
按從上到下從左到右的順序輸出二叉樹的葉子結點。
示例輸入
abd,,eg,,,cf,,,
xnl,,i,,u,,
示例輸出
dfg
uli
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct node
{
    char data;
    struct node *l,*r;
} Node;

Node*queue[1000];
int front,rear;
int j,k;
char s[100];
Node*create_tree();
void find_leaf_by_level_visit(Node*p);
int main()
{
    Node*root;
    while((scanf("%s",s))!=EOF)
    {
        j = 0;
        k = strlen(s);
        root = create_tree();
        find_leaf_by_level_visit(root);
        printf("\n");
    }
    return 0;
}

Node*create_tree()
{
    Node*p;
    if(s[j] == ',' || j >= k)
    {
        j++;
        p = NULL;
        return p;
    }
    else
    {
        p = (Node*)malloc(sizeof(Node));
        p->data = s[j++];
        p->l = create_tree();
        p->r = create_tree();
    }
    return p;
}

void find_leaf_by_level_visit(Node*p)
{
    Node *q;
    front = rear = 0;
    if(p)
    {
        queue[rear++] = p;//進佇列進行判定
        while(front < rear)//佇列不空取隊首檢測是否為葉子
        {
            q = queue[front++];
            /*q所指節點為葉子輸出*/
            if(q->l == NULL && q->r == NULL)
                printf("%c",q->data);
            /*不是葉子,將其子節點入佇列*/
            if(q->l)
                queue[rear++] = q->l;
            if(q->r)
                queue[rear++] = q->r;
        }
    }
}

相關文章