二叉树遍历(牛客网)

描述

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

}

总结

然后就结束了

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

相关推荐
怀旧,3 分钟前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵16 分钟前
有效的括号题解
数据结构·算法·
GIS小天22 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
_Itachi__43 分钟前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵
不忘不弃43 分钟前
计算矩阵A和B的乘积
线性代数·算法·矩阵
不爱写代码的玉子1 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
Java 技术轻分享1 小时前
《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
数据结构·算法·二叉树··都差速
芜湖xin1 小时前
【题解-洛谷】P1706 全排列问题
算法·dfs
chao_7892 小时前
链表题解——两两交换链表中的节点【LeetCode】
数据结构·python·leetcode·链表
曦月逸霜3 小时前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法