牛客网(二叉树)

news/2024/7/2 23:33:55

https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking 

这个题目和leetcode比起来就是有一些不一样,需要我们自己来写接口函数,所以有一些麻烦,我们得写一个中序遍历的函数做最后的输出,也得写一个函数来存储字符进去,还得写一个接口函数来创造节点,这个题目就和二叉树如何创造节点很相似,我们一个一个接口来进行分析,首先我这里直接给出大家需要的结构体。

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

这个就是很基础的结构体中的内容,因为我们每次放字符进去需要创造节点,我们这样就可以继续写一个创造节点的函数,我们来看看。、

TreeNode* CreatNode(char x)
{
    TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));
    newnode->val = x;
    newnode->left = newnode->right = NULL;
    return newnode;
}

 

接下来难得其实就是我们如何把这些字符放到这个里面我们对着代码讲可能简单理解一点。

TreeNode* maketree(char* a, int* pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    TreeNode* root = CreatNode(a[(*pi)++]);
    root->left = maketree(a, pi);
    root->right = maketree(a, pi);
    return root;
}

 

 我们得子问题就是一个父亲节点和两个孩子节点应该怎么进行链接,我们遇到字符‘#’得时候就得返回空指针,如果不是空得时候就得创造节点,把值放进去,然后进行遍历得就行,但是我们需要进行链接,所以root得left和right要指向我们得函数递归得地方,大家也可以画画递归展开图进行理解。

 

我们前序存储就需要变成这样得一棵树。

完整代码

#include<stdio.h>
typedef struct TreeNode
{
    char val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;
 
TreeNode* CreatNode(char x)
{
    TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));
    newnode->val = x;
    newnode->left = newnode->right = NULL;
    return newnode;
}
TreeNode* maketree(char* a, int* pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    TreeNode* root = CreatNode(a[(*pi)++]);
    root->left = maketree(a, pi);
    root->right = maketree(a, pi);
    return root;
}
void Inorder(TreeNode* root)
{
    if(root == NULL)
    {
        return ;
    }
    Inorder(root->left);
    printf("%c ",root->val);
    Inorder(root->right);
}
int main()
{
    char arr[101];
    scanf("%s",arr);
    int count = 0;
    TreeNode* tree = maketree(arr,&count);
    Inorder(tree);
    return 0;
}

 

又是水文章得一天。 


http://lihuaxi.xjx100.cn/news/1883041.html

相关文章

仿照MyBatis手写一个持久层框架学习

首先数据准备&#xff0c;创建MySQL数据库mybatis&#xff0c;创建表并插入数据。 DROP TABLE IF EXISTS user_t; CREATE TABLE user_t ( id INT PRIMARY KEY, username VARCHAR ( 128 ) ); INSERT INTO user_t VALUES(1,Tom); INSERT INTO user_t VALUES(2,Jerry);JDBC API允…

vscode 编写爬虫爬取王者荣耀壁纸

网上关于爬虫大部分教程和编辑器用的都不是vscode &#xff0c;此教程用到了vscode、Python、bs4、requests。 vscode配置Python安装环境可以看看这个大佬的教程 03-vscode安装和配置_哔哩哔哩_bilibili vscode配置爬虫环境可以参考这个大佬的教程【用Vscode实现简单的python…

Android App-targetSDKVersion28升级为30

为什么要修改targetSDKVersion&#xff1f; 1、应用开发平台要求&#xff08;小米&#xff09; 2、更好的兼容新版本的手机 有targetSDKVersion的位置&#xff1a; App的targetSDKVersionModule中的targetSDKVersion引入的第三方库中有targetSDKVersion 修改了App和Module中…

2.2 C语言之常量

2.2 C语言之常量 一、常量 一、常量 类似于1234的整数常量属于int类型。 printf("%d\n", 1234);long类型的常量以l或L结尾 printf("%d\n", 123456789l);printf("%d\n", 123456789L);如果一个整数太大&#xff0c;以至于无法用int类型表示时&…

D28|买卖股票的最佳时机+跳跃游戏

122.买卖股票的最佳时机 II 初始思路&#xff1a; 这道题解题的时候比较像在找规律&#xff0c;发现只要计算这个过程中的两数之差然后相加即可。 题解复盘&#xff1a; 可以更加清晰的发现如何从题意中获得贪心的思路。 如何贪心&#xff1a;局部最优&#xff1a;收集每天的…

PPP协议概述与实验示例

PPP协议概述与实验示例 概述 PPP&#xff08;Point-to-Point Protocol&#xff09;是一种用于在点对点连接上传输多协议数据包的标准方法。它已经成为最广泛使用的互联网接入数据链路层协议&#xff0c;可以与各种技术结合&#xff0c;如ADSL、LAN等&#xff0c;实现宽带接入…

TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?

文章目录 1、TCP 和 UDP 区别&#xff1f;2、TCP/IP 协议涉及哪几层架构&#xff1f;3、描述下 TCP 连接 4 次挥手的过程&#xff1f;为什么要 4 次挥手&#xff1f;4、计算机插上电源操作系统做了什么&#xff1f;5、Linux 操作系统设备文件有哪些&#xff1f; 1、TCP 和 UDP …

选项式API和组合式API

简介 Vue 3支持选项式API和组合式API。其中&#xff0c;选项式API是从Vue 2开始使用的一种写法&#xff0c;而Vue 3新增了组合式API的写法。 选项式API 选项式API是一种通过包含多个选项的对象来描述组件逻辑的API&#xff0c;其常用的选项包括data、methods、computed、watch…