二叉树遍历

今天讲的不是 leetcode 上的题,但也和二叉树有关,一道比较有意思的题

牛客网上的题,如果看懂了,也可以来试着做一下:

二叉树遍历_牛客题霸_牛客网 (nowcoder.com)


题目

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

输入描述:

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

文字 和 画图 分析

和之前的题不一样的一点,这道题难在如何构建二叉树

这里我们可以利用二叉树前序遍历的同时,将二叉树的左子树和右子树连接起来

以题例举例:

搭建过程:

需要注意的一点是,二叉树的搭建结束,最后连的一根线一定的空树,当前序走完后,其实这个字符串的字符已经全部拿完了,我们可以不需要通过字符是否到 '\0' ,来判断是否已经搭建好

已经连接好各个节点后,利用树再去中序遍历就很简单了


代码

cpp 复制代码
#include <stdio.h>
#include<stdlib.h>
typedef char TLtype;
typedef struct treelist
{
	 TLtype val;
	struct treelist* left;
	struct treelist* right;
}TL;
TL* creatnode(char x)
{
	TL* newnode = (TL*)malloc(sizeof(TL));
	newnode->val = x;
	return newnode;
}
TL* sertree(int *pi,char *pa)
{
    
        if(pa[*pi] == '#')
        {
            (*pi)++;
            return NULL;
        }
          TL* root = creatnode(pa[(*pi)++]);
           root->left = sertree(pi,pa);
           root->right = sertree(pi,pa);
           return root;
    return root;
}
void  Inorder(TL *root)
{
    if(root == NULL)
    {
        return;
    }
    Inorder(root->left);
    printf("%c ",root->val);
    Inorder(root->right);
}
int main()
{
    TL *plist = NULL;
    char ch[100];
    scanf("%s",ch);
    int i = 0;
    plist = sertree(&i,ch);
    Inorder(plist);
    return 0;
}
相关推荐
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假5 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠6 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦13 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠14 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾14 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82114 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q14 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒14 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记14 天前
单项不带头不循环链表
数据结构·链表