6-11 先序输出叶结点 (15 分) 数据结构与算法题目集(中文)

本题要求按照先序遍历的顺序输出给定二叉树的叶结点。

函数接口定义:

void PreorderPrintLeaves( BinTree BT );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

函数PreorderPrintLeaves应按照先序遍历的顺序输出给定二叉树BT的叶结点,格式为一个空格跟着一个字符。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void PreorderPrintLeaves( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Leaf nodes are:");
    PreorderPrintLeaves(BT);
    printf("
");

    return 0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

Leaf nodes are: D E H I

复习考研,书上只写了中序遍历的非递归算法,所以找一道题试试前序遍历能不能写出来。

代码:
#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree Insert(BinTree T,ElementType X) {
    if(T == NULL) {
        T = (BinTree)malloc(sizeof(TNode));
        T -> Left = T -> Right = NULL;
        T -> Data = X;
    }
    else if(X < T -> Data) {
        T -> Left = Insert(T -> Left,X);
    }
    else {
        T -> Right = Insert(T -> Right,X);
    }
    return T;
}
BinTree CreatBinTree();
void PreorderPrintLeaves( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Leaf nodes are:");
    PreorderPrintLeaves(BT);
    printf("
");

    return 0;
}
BinTree CreatBinTree() {
    BinTree Bt = NULL;
    int n;
    ElementType ch;
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) {
        getchar();
        scanf("%c",&ch);
        Bt = Insert(Bt,ch);
    }
    return Bt;
}
void PreorderPrintLeaves( BinTree BT ) {
    BinTree b[100];
    int c = 0;
    if(BT) b[c ++] = BT;
    while(c != 0) {
        BinTree temp = b[-- c];
        if(!(temp -> Left || temp -> Right)) printf(" %c",temp -> Data);
        if(temp -> Right) b[c ++] = temp -> Right;
        if(temp -> Left) b[c ++] = temp -> Left;
    }
}
原文地址:https://www.cnblogs.com/8023spz/p/11335929.html