【刷题】KY11 二叉树遍历

news/2024/11/3 1:29:18/

KY11 二叉树遍历

  • 一、题目描述
  • 二、示例
  • 三、实现


KY11 二叉树遍历

一、题目描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:
输入包括1行字符串,长度不超过100。

输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

二、示例

输入:abc##de#g##f###
输出:c b e g d f a

三、实现

由先序序列ABC##DE#G##F### :【根,左,右】
第一个为二叉树的根节点A,
然后B为A左子树的根,C为B的左子树的根,C的左右子树都为#,D为B的右子树,E为D的左子树的根,E的左子树为空,E的右子树为G,G的左右子树都为空,F为D的右子树的根,F的左右子树都为空。
A的右子树为空。

首先我们要有先序序列字符串的输入,然后根据先序序列创建一颗二叉树。

int main() {char a[100];scanf("%s", a);int i = 0;BTNode* root = CreateTree(a, &i);InOrder(root);printf("\n");return 0;
}

在CreateTree构建二叉树中,因为要对先序字符串进行遍历,所以需要传入先序序列,在构建的过程中使用递归遍历,为了保持只想先序字符串的索引一致,还需要遍历的索引i,并使用引用传递。

我们还要提供二叉树的结点定义,因为要根据字符新建结点,提供了一个创建结点的函数:

typedef int BTDataType;
typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDataType data;
} BTNode;BTNode* CreateNode(BTDataType x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){printf("malloc fail\n");exit(-1);}node->data = x;node->left = node->right = NULL;return node;
}

具体遍历时:
如果该字符不为#,则创建该结点,遍历指针后移,然后构建该结点的左子树,构建该结点的右子树。
如果遇到#,则返回空,并且遍历指针要后移。

BTNode* CreateTree(char* a, int* pi)
{if(a[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = CreateNode(a[*pi]);(*pi)++;root->left = CreateTree(a, pi);root->right = CreateTree(a, pi);return root;
}

然后再给出中序遍历就可以了,完整代码如下:

#include <stdio.h>
#include <stdlib.h>typedef int BTDataType;
typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDataType data;
} BTNode;BTNode* CreateNode(BTDataType x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){printf("malloc fail\n");exit(-1);}node->data = x;node->left = node->right = NULL;return node;
}BTNode* CreateTree(char* a, int* pi)
{if(a[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = CreateNode(a[*pi]);(*pi)++;root->left = CreateTree(a, pi);root->right = CreateTree(a, pi);return root;
}void InOrder(BTNode* root)
{if(root == NULL)return;InOrder(root->left);printf("%c ", root->data);InOrder(root->right);
}int main() {char a[100];scanf("%s", a);int i = 0;BTNode* root = CreateTree(a, &i);InOrder(root);printf("\n");return 0;
}

http://www.ppmy.cn/news/118577.html

相关文章

把VS Code打造成后端开发的宇宙IDE,也挺爽

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注&#xff01; 作者&#xff1a;维生素P|慕课网优质作者 工欲善其事必先利其器&#xff0c;提高程序员的开发效率必须要有一个好的开发工具。而一旦提到开发工具&#xff…

了解并使用 SOCKS5 代理和代理 IP 进行网络连接

本文将介绍 SOCKS5 代理和代理 IP 的概念&#xff0c;探讨它们在网络连接中的作用和应用。我们将了解如何设置和配置 SOCKS5 代理&#xff0c;并讨论代理 IP 的用途和优势。此外&#xff0c;还将探讨 SOCKS5 代理和代理 IP 在隐私保护和访问控制方面的应用 在当今互联网环境中&…

Ocam录屏软件安装包以及使用说明

链接&#xff1a;https://pan.baidu.com/s/1muliES1Kuh2rj2cppa4jxQ 提取码&#xff1a;iplw 使用方法在我的资源中&#xff0c;欢迎收看使用~

班迪录屏注册机(Bandicam)

链接&#xff1a;https://pan.baidu.com/s/1O0s-4_Xz4DdCuTejVB4d7g 提取码&#xff1a;qb50

Clion软件汉化

对于有很多英语不太好的家人们&#xff0c;语言的汉化是必不可少的&#xff0c;因为如果英语不好&#xff0c;会使开发效率大大降低&#xff0c;而且稍有不慎就会操作失误&#xff0c;一朝回到解放前&#xff0c;这里就详细介绍一下CLion是如何进行汉化的吧&#xff01; 首先&…

gtx660 linux驱动下载,佳能 GeForce GTX 660 驱动程序下载-更新佳能软件(显卡)

Nvidia GeForce GTX 660 驱动程序下载 如何手动下载和更新: 您的Nvidia GeForce GTX 660 最新驱动程序版本可在下面下载。 下载后,使用窗口中的设备管理器更新文件。 开发人员: Nvidia 集团: 显卡 配置: GeForce 系列: GTX 660 操作系统: Windows XP, Vista, 7, 8, 10 驱动程…

c 语言 编程 pci,佳能 C-Media PCI Audio Device 驱动程序下载-更新佳能软件(音频控制器)...

首页 → 驱动程序 → Zoltrix → 音频控制器 → C-Media PCI Audio Device Zoltrix C-Media PCI Audio Device 驱动程序下载 手动更新你的 C-Media PCI Audio Device 驱动程序&#xff1a; 您的 %%os%% 或通过安装最新的 Windows 更新将包含 C-Media PCI Audio Device 驱动程序…

最棒的游戏制作软件VAM Virt A mate汉化 优秀豪华 整合

这个不能错过了&#xff0c;大师之作&#xff0c;捏人老师的照片&#xff0c;爽 看看这个皮肤的细腻程度&#xff0c;水平不是一般高&#xff0c;也只有这个软件可以制作出来 看看这个皮肤的细腻程度&#xff0c;水平不是一般高&#xff0c;也只有这个软件可以制作出来 使用V…