数据结构实验五 二叉树

目录

1. 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数

2. 按层次遍历二叉树


1. 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数

【问题描述】

题目描述

对于给定的二叉树,输出其先序序列、中序序列、后序序列并输出叶子结点数。

输入格式:

二叉树的先序遍历序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

若是非空二叉树,则输出四行内容 第一行是二叉树的先序遍历序列; 第二行是二叉树的中序遍历序列; 第三行是二叉树的后序遍历序列; 第四行是叶子结点数;

若是空二叉树 只需输出叶子数0


【输入形式】

FCA##DB###EHM###G##

【输出形式】

FCADBEHMG

ACBDFMHEG

ABDCMHGEF

4

【样例输入】

#

【样例输出】

0
 

【样例说明】
【评分标准】

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

typedef struct TreeNode {
    char data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

TreeNode* createTree(char* preorder, int* index) {
    char val = preorder[*index];
    (*index)++;
    if (val == '#') {
        return NULL;
    }
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->data = val;
    node->left = createTree(preorder, index);
    node->right = createTree(preorder, index);
    return node;
}

void preorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    printf("%c", root->data);
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}

void inorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    inorderTraversal(root->left);
    printf("%c", root->data);
    inorderTraversal(root->right);
}

void postorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    postorderTraversal(root->left);
    postorderTraversal(root->right);
    printf("%c", root->data);
}

int countLeaves(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    if (root->left == NULL && root->right == NULL) {
        return 1;
    }
    return countLeaves(root->left) + countLeaves(root->right);
}

int main() {
    char preorder[100];
    scanf("%s", preorder);
    int index = 0;
    TreeNode* root = createTree(preorder, &index);

    if (root == NULL) {
        printf("0\n");
    } else {
        preorderTraversal(root);
        printf("\n");
        inorderTraversal(root);
        printf("\n");
        postorderTraversal(root);
        printf("\n");
        printf("%d\n", countLeaves(root));
    }

    return 0;
}

2. 按层次遍历二叉树

【问题描述】

以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’, 表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉树,然后按层次遍历该二叉树并输出结点数据。


【输入形式】

字符串形式的先序序列(即结点的数据类型为单个字符)


【输出形式】

按层次遍历二叉树的结果

【样例输入】

ABDG##HI####CE#J##F##


【样例输出】

ABCDEFGHJI

【样例说明】
【评分标准】

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

typedef struct TreeNode {
    char data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

TreeNode* createTree(char* str, int* index) {
    if (str[*index] == '#') {
        (*index)++;
        return NULL;
    }

    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->data = str[*index];
    (*index)++;
    node->left = createTree(str, index);
    node->right = createTree(str, index);
    return node;
}

void levelOrderTraversal(TreeNode* root) {
    if (root == NULL) return;

    TreeNode* queue[100];
    int front = 0, rear = 0;
    queue[rear++] = root;

    while (front < rear) {
        TreeNode* node = queue[front++];
        printf("%c", node->data);
        if (node->left) queue[rear++] = node->left;
        if (node->right) queue[rear++] = node->right;
    }
}

int main() {
    char str[100];
    scanf("%s",&str);
    int index = 0;
    TreeNode* root = createTree(str, &index);
    levelOrderTraversal(root);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/timberman666/article/details/134403701