【数据结构与算法】二叉树基础OJ--下(巩固提高)

news/2024/7/24 5:49:30 标签: 算法, 数据结构, c语言, vscode, leetcode

前言:

        上一篇文章我们讲到二叉树基础oj题目的练习,此篇文章是完成基础oj练习的完结篇。

传送-->【数据结构算法】二叉树基础OJ -- 上 (巩固提高)-CSDN博客

💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥

✨✨刷题专栏:http://t.csdn.cn/UlvTc

⛳⛳本篇内容:力扣与牛客网上二叉树OJ基础练习

目录

KY11 二叉树遍历

题目描述:

解题思路:

leetcode%2094.%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86(%E6%95%B0%E7%BB%84%E5%AD%98%E5%82%A8)-toc" style="margin-left:0px;">leetcode 94.二叉树中序遍历(数组存储)

题目描述:

​编辑

解题思路:

leetcode%20145%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86(%E6%95%B0%E7%BB%84%E5%AD%98%E5%82%A8)-toc" style="margin-left:0px;">leetcode 145二叉树的后序遍历(数组存储)

题目描述:

解题思路: 


KY11 二叉树遍历

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

题目描述:

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

输入描述:

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

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。 

示例1

输入:abc##de#g##f###
输出:c b e g d f a 

解题思路:

先来复习一遍前序遍历,在此基础上,遍历一个比较难的字符串。 

画出其前序遍历图:

画出其前序遍历递归图(省略一部分同理的),剩下的可以根据上面的前序遍历图可求出

有了上面的基础,我们写出代码实现部分:

typedef int BTDataType;
typedef struct BTreeNode
{
    int val;
    struct BTreeNode* left;
    struct BTreeNode* right;
}BTNode;

BTNode* BuyNode(BTDataType x)
{
    BTNode* root=(BTNode*)malloc(sizeof(BTNode));
    if(root == NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    root->val=x;
    root->left =NULL;
    root->right = NULL;

    return root;
}

BTNode* CreateTree(char* a,int* pi)
{
    if(a[(*pi)] =='#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode* root = BuyNode(a[(*pi)]);
    (*pi)++;

    root->left  = CreateTree(a, pi);
    root->right = CreateTree(a,pi);
    return root;
}
void InOrder(BTNode* root)
{
    if(root == NULL)
    {
        return ;
    }
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}
int main()
{
    char a[100];
    scanf("%s",a);
    int i=0;
    BTNode* root=CreateTree(a,&i);
    InOrder(root);
    printf("\n");
}

执行: 

leetcode%2094.%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86(%E6%95%B0%E7%BB%84%E5%AD%98%E5%82%A8)">leetcode 94.二叉树中序遍历(数组存储)

题目来源:94. 二叉树的中序遍历 - 力扣(LeetCode)

题目描述:

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例:

解题思路:

跟上一篇的前序遍历相差不大,就是将参数换个位置,其它不便说明。

代码实现:

int TreeSize(struct TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    return TreeSize(root->left) + TreeSize(root->right) +1;
}
void _inorder(struct TreeNode* root,int* a,int* pi)
{
    if(root==NULL)
    {
        return ;
    }
    _inorder(root->left,a,pi);
    a[(*pi)++]=root->val;
     _inorder(root->right,a,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = TreeSize(root);
    int* a=(int*)malloc(*returnSize *sizeof(int));

    int i=0;
    _inorder(root,a,&i);
    return a;
}

代码执行: 

leetcode%20145%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86(%E6%95%B0%E7%BB%84%E5%AD%98%E5%82%A8)">leetcode 145二叉树的后序遍历(数组存储)

题目来源:145. 二叉树的后序遍历 - 力扣(LeetCode)

题目描述:

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例:

解题思路: 

跟上一篇的前序遍历相差不大,就是将参数换个位置,其它不便说明。

代码实现:

int TreeSize(struct TreeNode* root)
{
    return root==NULL ? 0 : TreeSize(root->left) + TreeSize(root->right)+ 1;
}
void _postorder(struct TreeNode*root,int* a,int* pi)
{
    if(root==NULL)
    {
        return ;
    }
    _postorder(root->left,a,pi);
    _postorder(root->right,a,pi);
    a[(*pi)++]=root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize=TreeSize(root);
    int* a=(int*)malloc(*returnSize*sizeof(struct TreeNode));

    int i=0;
    _postorder(root,a,&i);
    return a;
}

         此篇文章到此结束,感谢你的来访!


http://www.niftyadmin.cn/n/5137150.html

相关文章

LeetCode--511. 游戏玩法分析 I

文章目录 1 题目描述1.1 测试用例 2 解题思路2.1 代码实现 1 题目描述 活动表 Activity: ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_played …

腾讯云轻量应用服务器“月流量”不够用怎么办?

腾讯云轻量应用服务器“月流量”不够用怎么办?超额部分支付流量费,价格为0.8元/GB。腾讯云轻量服务器月流量什么意思?月流量是指轻量服务器限制每月流量的意思,不能肆无忌惮地使用公网,流量超额需要另外支付流量费&…

软考网工历年简答题汇总(2016下半年~2023年上半年)

目录 2016年下半年 2018年上半年 2018年下半年 2021年上半年 2022年上半年 2022年下半年 2023年上半年 2016年下半年 试题一: 【问题 3】若地址规划如图 1-1 所示,从IP 规划方案看该地址的配置可能有哪些方面的考虑? 答案&#xff…

终于有人把腾讯云轻量服务器“月流量”说明白了

腾讯云轻量服务器月流量什么意思?月流量是指轻量服务器限制每月流量的意思,不能肆无忌惮地使用公网,流量超额需要另外支付流量费,上海/广州/北京等地域的轻量服务器月流量不够用超额部分按照0.8元/GB的价格支付流量费。阿腾云aten…

【c++|opencv】二、灰度变换和空间滤波---3.均值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 均值滤波 1. 均值滤波 #include <iostream> #include <opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using names…

算法通关村第四关-黄金挑战栈的经典问题

括号匹配问题 描述 : 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有…

PHP自定义文件缓存实现

文件缓存&#xff1a;可以将PHP脚本的执行结果缓存到文件中。当一个PHP脚本被请求时&#xff0c;先查看是否存在缓存文件&#xff0c;如果存在且未过期&#xff0c;则直接读取缓存文件内容返回给客户端&#xff0c;而无需执行脚本 1、文件缓存写法一&#xff0c;每个文件缓存一…

前端开发必备技能!用简单CSS代码绘制三角形,提升用户体验

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、前…