设一棵二叉树的中序遍历序列为: C E I F G B A D H , 后序遍历序列为: E I C B G A H D F 求: (1)画出这棵二叉树。 (2)写出该二叉树的前序遍历序列。 (3)将这棵二叉树转换成对应的树(或森林)。
时间: 2023-06-19 19:05:51 浏览: 187
(1) 根据中序遍历序列和后序遍历序列可知根节点为F,因为后序遍历的最后一个元素为根节点,F在中序遍历中左侧的为左子树,右侧的为右子树;以此类推,递归构建整棵树,如下图所示:
```
F
/ \
C B
/ \ / \
E I G A
/ \
H D
```
(2) 该二叉树的前序遍历序列为:F C E I B G A H D
(3) 将该二叉树转换成对应的树(或森林)如下图所示:
```
F B
/ \ / \
C D G A
/ \ / \ \
E I H F D
\
B
/ \
G A
/
H
```
相关问题
用C语言编写二叉树的递归遍历程序,实现:给定一棵二叉树的“扩展先序遍历序列”,创建这棵 二叉树 (1)输出二叉树的先序遍历的结点序列。 (2)输出二叉树的后序遍历的结点序列。 (3)输出二叉树的中序遍历的结点序列。 (4)输出二叉树的叶子结点。 (5)统计二叉树的结点个数。
非常感谢您的提问。以下是C语言实现二叉树递归遍历的程序,并按要求输出结果。
```
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建二叉树(根据扩展先序遍历序列)
TreeNode *createTree() {
char c;
scanf("%c", &c);
if(c == '#') {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = c;
root->left = createTree();
root->right = createTree();
return root;
}
// 先序遍历
void preOrder(TreeNode *root) {
if(root == NULL) {
return;
}
printf("%c ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 后序遍历
void postOrder(TreeNode *root) {
if(root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%c ", root->data);
}
// 中序遍历
void inOrder(TreeNode *root) {
if(root == NULL) {
return;
}
inOrder(root->left);
printf("%c ", root->data);
inOrder(root->right);
}
// 输出叶子结点
void leafNodes(TreeNode *root) {
if(root == NULL) {
return;
}
if(root->left == NULL && root->right == NULL) {
printf("%c ", root->data);
}
leafNodes(root->left);
leafNodes(root->right);
}
// 统计结点个数
int countNodes(TreeNode *root) {
if(root == NULL) {
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
int main() {
printf("请输入二叉树的扩展先序遍历序列(#表示空结点):\n");
TreeNode *root = createTree();
printf("先序遍历结果:");
preOrder(root);
printf("\n后序遍历结果:");
postOrder(root);
printf("\n中序遍历结果:");
inOrder(root);
printf("\n叶子结点为:");
leafNodes(root);
printf("\n结点个数为:%d\n", countNodes(root));
return 0;
}
```
您可以将上面的代码保存为一个名为 `binary_tree.c` 的文件中,并使用 `gcc` 编译器编译运行:
```
gcc binary_tree.c -o binary_tree
./binary_tree
```
输入扩展先序遍历序列后,程序会按要求输出先序遍历、后序遍历、中序遍历、叶子结点和结点个数的结果。
c语言 二叉树 任务:建立二叉树,并实现二叉树的遍历以及求根结点到指定结点的路径。 功能要求: 1) 建立二叉树存储结构; 2) 对二叉树进行先序、中序、后序、层序遍历,并输出对应遍历序列; 3) 求根结点到指定结点的路径。 界面要求:程序运行后,给出菜单项的内容和输入提示: 1. 建立二叉树存储结构 2. 求二叉树的先序遍历序列 3. 求二叉树的中序遍历序列 4. 求二叉树的后序遍历序列 5. 求二叉树的层序遍历序列 6. 求根结点到指定结点的路径 0. 退出 请选择0-5:
好的,以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 二叉树结点定义
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 建立二叉树
TreeNode* createTree() {
int val;
scanf("%d", &val);
if (val == -1) {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = val;
root->left = createTree();
root->right = createTree();
return root;
}
// 先序遍历
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preOrder(root->left);
preOrder(root->right);
}
// 中序遍历
void inOrder(TreeNode* root) {
if (root == NULL) {
return;
}
inOrder(root->left);
printf("%d ", root->val);
inOrder(root->right);
}
// 后序遍历
void postOrder(TreeNode* root) {
if (root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->val);
}
// 层序遍历
void levelOrder(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("%d ", node->val);
if (node->left != NULL) {
queue[rear++] = node->left;
}
if (node->right != NULL) {
queue[rear++] = node->right;
}
}
}
// 查找指定结点并返回该结点到根的路径
bool findNode(TreeNode* root, int val, int path[], int index) {
if (root == NULL) {
return false;
}
if (root->val == val) {
path[index] = root->val;
return true;
}
if (findNode(root->left, val, path, index + 1) || findNode(root->right, val, path, index + 1)) {
path[index] = root->val;
return true;
}
return false;
}
int main() {
TreeNode* root = NULL;
int choice;
do {
printf("1. 建立二叉树存储结构\n");
printf("2. 求二叉树的先序遍历序列\n");
printf("3. 求二叉树的中序遍历序列\n");
printf("4. 求二叉树的后序遍历序列\n");
printf("5. 求二叉树的层序遍历序列\n");
printf("6. 求根结点到指定结点的路径\n");
printf("0. 退出\n");
printf("请选择0-6:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入二叉树元素,-1表示空结点:");
root = createTree();
break;
case 2:
printf("二叉树的先序遍历序列为:");
preOrder(root);
printf("\n");
break;
case 3:
printf("二叉树的中序遍历序列为:");
inOrder(root);
printf("\n");
break;
case 4:
printf("二叉树的后序遍历序列为:");
postOrder(root);
printf("\n");
break;
case 5:
printf("二叉树的层序遍历序列为:");
levelOrder(root);
printf("\n");
break;
case 6: {
int val;
printf("请输入要查找的结点值:");
scanf("%d", &val);
int path[100] = {0};
bool isFound = findNode(root, val, path, 0);
if (isFound) {
printf("%d到根的路径为:", val);
for (int i = 99; i >= 0; i--) {
if (path[i] != 0) {
printf("%d ", path[i]);
}
}
printf("\n");
} else {
printf("未找到该结点!\n");
}
break;
}
case 0:
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (choice != 0);
return 0;
}
```
该代码实现了建立二叉树存储结构,并且实现了二叉树的先序、中序、后序、层序遍历以及求根结点到指定结点的路径。界面要求程序运行后,给出菜单项的内容和输入提示。用户可以根据菜单项输入数字选择功能。
阅读全文