目录
1. 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数
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;
}