当前位置: 首页 > article >正文

二叉树遍历(牛客网)

描述

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

输入描述:

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

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每

个字符后面都有一个空格。 每个输出结果占一行。

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

这一题很多人其实连题目都没有读懂到底是什么意思?它是要我们表达什么,或者是要我们干什么。其实它就是说给我们一组字符串,然后要我们把这个字符串先构建成一个二叉树,然后在把这个二叉数用中序遍历来输出结果就可以了。

我们一步一步的来解决这个问题

一.初始化

我们先要有个大局观,先把主函数写了,先把一个主要的思路完成,这个题目我们的思路就是

int main() {
  char str[100];//创建字符数组
  scanf("%s",str);
  int i=0;
  TNode*root=CreateTree(str,&i);将字符数据变成二叉树
  Inorder(root);中序遍历
    return 0;
}

当然我们还需要先初始化一个二叉树

typedef struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char val;
}TNode;

二.创建二叉树

TNode*CreateTree(char*a,int*pi);

首先先把char*a,int*pi传过去,一个是数组名,一个是下标

然后就是第一个判断,如果在字符中出现了#,说明是空,所以我们要下标++,直接返回NULL,这个也为后面的递归做了条件

if(a[*pi]=='#')
  {
    (*pi)++;
    return NULL;
  }

首先我们要为根节点开辟空间,如果是空,就要报错,如果不是空,我们就把数组的数据存放到这个根节点里面,然后要它向后走,进入递归,先左在右,进入左了之后,原左孩子变成了根节点,就继续走。知道把字符数据都遍历到二叉树中去

TNode*root=( TNode*)malloc(sizeof(TNode));
     if(root==NULL)
     {
        printf("mallco fail\n");
        exit(-1);
     }
     root->val=a[*pi];
     (*pi)++;
     root->left=CreateTree(a,pi);
     root->right=CreateTree(a,pi);

整体

TNode*CreateTree(char*a,int*pi)
{
  if(a[*pi]=='#')
  {
    (*pi)++;
    return NULL;
  }
     TNode*root=( TNode*)malloc(sizeof(TNode));
     if(root==NULL)
     {
        printf("mallco fail\n");
        exit(-1);
     }
     root->val=a[*pi];
     (*pi)++;
     root->left=CreateTree(a,pi);
     root->right=CreateTree(a,pi);
     return root;
}

三.中序遍历

void Inorder(TNode*root)
{
    if(root==NULL)
        return;
    Inorder(root->left);
    printf("%c ",root->val);
    Inorder(root->right);

}

总结

然后就结束了

我认为这个题目难就难在创建二叉树,和题目的意思,只有意思理解了就好做了


http://www.kler.cn/a/273650.html

相关文章:

  • 【人工智能】自然语言生成的前沿探索:利用GPT-2和BERT实现自动文本生成与完形填空
  • 【GlobalMapper精品教程】093:将tif影像色彩映射表(调色板)转为RGB全彩模式
  • Zstandard压缩算法
  • YOLOv5改进 | CARAFE提高精度的上采样方法
  • FreePBX 17 on ubuntu24 with Asterisk 20
  • 计算机网络之---MAC协议
  • Apache Doris 2.1 核心特性 Variant 数据类型技术深度解析
  • 王老吉药业开拓数字经济“新蓝海”,成立数字经济研究所,科技赋能新品压片糖
  • 华为机试题-最小矩阵
  • RPM与DNF的操作实践
  • Dubbo是什么?请简要描述其主要功能。Dubbo的架构是怎样的?请解释其核心组件及其作用。
  • 微服务篇-C 深入理解第一代微服务(SpringCloud)_IV 深入理解Hystrix断路器
  • 华为OD机试真题实战应用【赛题代码篇】-素数伴侣(附Java、C++和python代码实现)
  • [小程序开发] 外部样式类
  • Java安装及环境配置详细教程
  • 2024年敏捷产品负责人CSPO认证培训
  • 深度学习实战模拟——softmax回归(图像识别并分类)
  • Java进阶 Maven基础
  • H5页面兼容offsetTop
  • uniapp+vue3+setup语法糖开发微信小程序时不能定义globalData的解决方法
  • vue3 计算属性(computed)和监听属性(watch)的异同
  • 租一个阿里云的服务器多少钱?30元、61元、99元、165元、199元
  • 机器学习复习(9)——自定义dataset
  • Linux 文件系统:文件描述符、管理文件
  • vue3.x 使用jsplumb进行多列拖拽连线
  • C++ cin标准输入流,及获取多个输入的方法