链式二叉树经典OJ题目(二)

news2024/10/6 19:19:40

目录

结构体及头文件:

1.二叉树的前序遍历

题目描述:

思路分析:

源码:

2.二叉树的翻转

题目描述:

思路分析:

源码:

3.另一颗子树

题目描述:

思路分析:

源码:

4.二叉树的遍历

题目描述:

思路分析:

源码:

结构体及头文件:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType val;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

1.二叉树的前序遍历

题目描述:

给你二叉树的根节点 root ,返回它节点值的前序遍历

思路分析:

设计条件:按照前序遍历(根——左子树——右子树)的方式遍历这棵树,访问左子树和右子树的时候同样按照这样的方式遍历,直到完整遍历这棵树。

判断条件设计:如果节点为空,直接返回。

成立条件设计:定义preorder表示当前遍历到root节点的答案,将root节点的值加入答案,递归调用preorder(root->left)来遍历这颗root节点的左子树,再调用preorder(root->right)遍历root节点右子树即可。

源码:

void preorder(BTNode * root, int* res, int* resSize) 
{
    if (root == NULL) {
        return;
    }
    res[(*resSize)++] = root->val;
    preorder(root->left, res, resSize);
    preorder(root->right, res, resSize);
}

int* preorderTraversal(BTNode * root, int* returnSize) 
{
    int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    preorder(root, res, returnSize);
    return res;
}

2.二叉树的翻转

题目描述:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点

思路分析:

设计条件:从根节点开始对树进行遍历,并从叶子节点开始翻转。

判断条件设计:如果节点为空,直接返回。

成立条件设计:遍历到的节点的root的左右两课子树都已经翻转,只需交换两课子树的位置,完成以root为根节点的整颗子树的翻转。

源码:

BTNode* invertTree(BTNode* root) 
{
    if (root == NULL) 
    {
        return NULL;
    }
    BTNode* left = invertTree(root->left);
    BTNode* right = invertTree(root->right);
    root->left = right;
    root->right = left;
    return root;
}

3.另一颗子树

题目描述:

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

思路分析:

源码:

bool isSametree(BTNode * A, BTNode * B)
{
    //递归终止
    if (A == NULL && B == NULL) 
    {
        return true;
    }
    if ((A == NULL && B != NULL) || (A != NULL && B == NULL)) 
    {
        return false;
    }
    //递归处理子问题
    if (A->val == B->val)
    {
        if ((isSametree(A->left, B->left)) && isSametree(A->right, B->right))
        { 
        return true;
        }
    }
    //最上层尾操作
    return false;
}

bool isSubtree(BTNode * root, BTNode * subRoot)
{
    //递归终止
    if (root == NULL) 
    {
    return false;
    }
    //递归处理子问题
    if (root->val == subRoot->val)
    {
        if (isSametree(root, subRoot)) 
        {
        return true;
        }
    }
    if (isSubtree(root->left, subRoot)) 
    {
    return true;
    }
    if (isSubtree(root->right, subRoot))
    { 
    return true;
    }
    //最上层尾操作
    return false;
}

4.二叉树的遍历

题目描述:

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

思路分析:

设计条件:分治思想,递归构建二叉树,构建二叉树先malloc出根节点然后再构建左子树,右子树即可。

判断条件设计:如果节点为空,直接返回。

成立条件设计:字符串需要构建之后指针向后移动找到下一个字符,需要一个count指针标记字符位置,构建之后指针向后移动,指针指向’#‘或者'\0'代表到了空节点了完成返回NULL即可。

源码:

BTNode* maketree(char* arr, int* count) 
{
    if (arr[*count] == '#' || arr[*count] == '\0')
    {
        return NULL;
    }
    BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
    newnode->val = arr[(*count)++];

    newnode->left = maketree(arr, count);
    (*count)++;
    newnode->right = maketree(arr, count);
    return newnode;
}

void Inorder(BTNode* 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;
    BTNode* tree = maketree(arr, &count);
    Inorder(tree);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯单片机真题实践篇

这里就不完全写思路过程代码什么的&#xff0c;这一篇文章就写我在训练真题中遇到的过程。 &#xff08;呜呜呜&#xff0c;时间不够辣&#xff0c;能做多少算多少吧....&#xff09; 十三届省赛题 问题1&#xff1a;数码管的数字消影不明显 &#xff08;参考&#xff1a;蓝…

Splunk Attack Range:一款针对Splunk安全的模拟测试环境创建工具

关于Splunk Attack Range Splunk Attack Range是一款针对Splunk安全的模拟测试环境创建工具&#xff0c;该工具完全开源&#xff0c;目前由Splunk威胁研究团队负责维护。 该工具能够帮助广大研究人员构建模拟攻击测试所用的本地或云端环境&#xff0c;并将数据转发至Splunk实例…

ARM架构学习笔记1-寄存器

ARM内部寄存器 有R0-R1516个寄存器 R0-R12通用目的寄存器Program status Register&#xff1a;程序状态寄存器 &#xff0c;用来保存某些状态的值保存:m3/m4架构保存在xPSR&#xff0c;coretex-A7架构保存在CPSR中XPSR是程序状态寄存器 MRS命令&#xff1a;表示Move to Regis…

Tuxera NTFS for Mac2023绿色免费版 免费的ntfs for mac 免费读写硬盘U盘工具

Tuxera NTFS 2023 Mac免费版是款适合Mac用户使用的磁盘读写工具。Tuxera NTFS 2023 Mac可以很好的帮助用户在Mac上打开、编辑、复制、移动或删除存储在Windows NTFS格式的USB驱动器上的文件。并且Tuxera NTFS 2023 Mac还可以无阻碍地使用各种文件系统磁盘&#xff0c;还能解决磁…

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成 目录 数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成&#xf…

vivado 向 SVF 目标添加器件

向 SVF 目标添加器件 创建 SVF 目标后 &#xff0c; 可向其中添加器件以定义 SVF JTAG 器件链配置。 SVF JTAG 器件链配置应与目标硬件链相匹配 &#xff0c; 以 确保能正确执行 SVF 文件。 使用 Vivado IDE 单击“ ”按钮以向 SVF 链添加赛灵思器件或非赛灵思器件。…

法向量估计

法向量估计 1. 求解点P法向量的原理2. 法向量估计的证明3. 为什么求点P的法向量&#xff0c;需要使用以P为中心的邻域内的点&#xff1f;4. 法向量估计的应用和思考5. 权重法向量估计 1. 求解点P法向量的原理 已知有一组点 P ( p 1 , p 2 , p 3 , . . . , p n ) , p i ∈ R 3…

糖豆人打开失败或无法运行

一般就是网络不行&#xff0c;选择加速器加速就好了。 eg: (uu加速器) 一般直接点启动游戏就行。 如果提示找不到文件路径&#xff0c;或者说直接弹出steam的登录的话就是配置路径有问题。现在糖豆人已经不再steam平台了&#xff0c;应该是epic才对。 配置方法&#xff1a;…

普通人想要赚钱,就要坚持五个要点

最近都在努力搞钱&#xff0c;所以今天就围绕【持续赚钱】&#xff0c;分享一些心得体会。 普通人想要赚钱&#xff0c;就要坚持以下5点&#xff1a; 持续学习 持续破圈 持续行动 坚持长期利他 坚持长期主义 1、持续学习 要持续学习&#xff0c;做一个终身学习者。 只有保持空杯…

通用开发技能系列:Git

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能Git进行学习 1.为什么使用版本控制系统 版本控制系统可以解决的问题 代码备份很重要版本控制很重要协同工作很重要责任追溯很重要 常见的版本控制系统 Gi…

【学习笔记】java项目—苍穹外卖day10

文章目录 苍穹外卖-day10课程内容1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功…

Django环境搭建及测试

Django环境搭建及测试 一、安装 Python二、安装 Django三、终端命令创建 Django 项目四、运行 Django 项目五、访问 Django 网站 一、安装 Python 首先确保你的电脑上安装了 Python。 Python官网点击直达 官网下载后双击即可安装 第一个相当于快速安装&#xff0c;第二个则是…

【保姆级讲解如何计算机视觉入门】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

C++中的STL——vector类的基本使用

目录 vector介绍 vetor类定义 vector常见构造 vector类中的容量操作 size()函数与capacity()函数 resize()函数 reserve()函数 max_size()函数 vector类中的数据遍历操作 operator[]()与at()函数 vector类中的迭代器遍历 正向遍历begin()和end()迭代器——非const …

练习 22 Web [极客大挑战 2019]BuyFlag

php弱类型比较&#xff0c;注意Cookie值&#xff0c;php利用数组赋值进行绕过,科学计数法 很明显是弱类型比较&#xff0c;之前的练习题已经遇到过 构造password404adsffd&#xff0c;后面随便什么字母都行 然后 money100000000 然后在student这里卡了很久&#xff0c;post…

SpringData ElasticSearch - 简化开发,完美适配 Spring 生态

目录 一、SpringData ElasticSearch 1.1、环境配置 1.2、创建实体类 1.3、ElasticsearchRestTemplate 的使用 1.3.1、创建索引 设置映射 1.3.2、创建索引映射注意事项&#xff08;必看&#xff09; 1.3.3、简单的增删改查 1.3.4、搜索 1.4、ElasticsearchRepository …

当代软件专业大学生与青年在新质生产力背景下的发展探究

在新质生产力的浪潮中,信息技术以前所未有的速度革新,为软件专业的大学生和青年带来了丰富的机遇,同时也伴随着一系列的挑战。他们如何把握时代的脉搏,实现个人的发展,成为了值得深入探讨的话题。 一、新质生产力背景下的机遇 随着新质生产力的不断发展,信息技术在各个领…

Vue3中的computed,watch和watchEffect的特点

1.computed 1&#xff09;computed拥有缓存性&#xff0c;多次调用会直接从缓存中获取&#xff0c;而不会重新执行&#xff0c;所以说computed性能很高。 例&#xff1a;下面是同时调用三次计算属性firstTotal和三次函数firstTotalFun()的运行结果。可以发现&#xff0c;函数被…

免费微信小程序源码分享~搭起来改一下就可以【创业】

【前言】现在很多人都想做微信小程序创业搞钱&#xff0c;但是苦于不会开发或过高的开发成本只能放弃&#xff0c;下面我收集了几套微信小程序的源码供各位有梦想的同学免费使用~ 这些小程序代码都包含了客户端和管理端&#xff0c;你搭建起来就可以开始创业搞钱了~ 下载链接&…

基于SpringBoot+Vue共享客栈管理系统(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…