二叉树遍历(牛客网)

描述

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

输入描述:

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

输出描述:

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

个字符后面都有一个空格。 每个输出结果占一行。
输入:abc##de#g##f### 输出:c b e g d f a

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

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

一.初始化

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

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

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

cpp 复制代码
typedef struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char val;
}TNode;

二.创建二叉树

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

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

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

cpp 复制代码
if(a[*pi]=='#')
  {
    (*pi)++;
    return NULL;
  }

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

cpp 复制代码
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);

整体

cpp 复制代码
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;
}

三.中序遍历

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

}

总结

然后就结束了

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

相关推荐
你撅嘴真丑9 小时前
第九章-数字三角形
算法
uesowys9 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder9 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮9 小时前
AI 视觉连载1:像素
算法
智驱力人工智能9 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥10 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风10 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風10 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT0611 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法