二叉树遍历(牛客网)

描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: 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);

}

总结

然后就结束了

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

相关推荐
Ocean☾8 分钟前
C语言-详细讲解-P1217 [USACO1.5] 回文质数 Prime Palindromes
c语言·数据结构·算法
沐泽Mu11 分钟前
嵌入式学习-C嘎嘎-Day08
开发语言·c++·算法
Non importa12 分钟前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
ac-er888842 分钟前
PHP 二分法查找算法
开发语言·算法·php
Choshim-1 小时前
7-9 求无向图连通分量的数量
数据结构·算法·深度优先
Eric.Lee20211 小时前
数据集-目标检测系列- 昙花(昙花一现) 检测数据集 epiphyllum >> DataBall
算法·yolo·目标检测·计算机视觉·昙花一现·昙花检测
淀粉肠kk2 小时前
【数据结构】二叉树(2)
数据结构·算法
总是学不会.2 小时前
【贪心算法】绿洲之旅:最少次数补给探索
java·算法·intellij-idea
超甜的布丁mm2 小时前
【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)
图像处理·人工智能·python·深度学习·算法·视觉检测·卷积神经网络
予安灵2 小时前
图的邻接矩阵和邻接表存储
数据结构·算法·