【手撕数据结构】二叉树oj题

目录

  • 单值二叉树
    • 题目描述
    • 题目思路及代码
  • 相同的树
    • 题目描述
    • 题目思路及代码
  • 对称二叉树
    • 题目描述
    • 题目思路及代码
  • 另一棵树的子树
    • 题目描述
    • 题目思路及代码
  • 二叉树的前序遍历
    • 题目描述
    • 题目思路及代码
  • 二叉树的构建与遍历
    • 题目描述
    • 题目思路及代码

单值二叉树

题目描述

在这里插入图片描述

题目思路及代码

  • 这道题的要求就是每个节点的值都要相等
  • 如果我们想要整个二叉树相等,就要让二叉树的子树都相等。想要先判断子树,我们就用先序遍历。先遍历左子树,然后遍历右子树。然后将其每个子树的父节点和他们的孩子节点的值进行比较是否相等。当所有左子树和右子树都比较完了,那么整颗二叉树就是一颗单值二叉树。
  • 如果当左右孩子的值其中一个不等于父节点的值,返回false
  • -如果遇到节点为NULL,说明从根节点到该节点的值都相同

注意:
在这里插入图片描述
下面是代码:

/**- Definition for a binary tree node.- struct TreeNode {-     int val;-     struct TreeNode *left;-     struct TreeNode *right;- };*/typedef struct TreeNode TreeNode;
bool isUnivalTree(struct TreeNode* root) {if(root == NULL){return true;}if(root->left && root->left->val != root->val || root->right && root->right->val != root->val){return false;}return isUnivalTree(root->left) && isUnivalTree(root->right);
}

相同的树

题目描述

在这里插入图片描述

题目思路及代码

  • 我们不光要求值相同,结构也要相同,也就是节点的位置也相同。
  • 那我们就可以先从结构入手,如果两颗二叉树都是空树,那么他们一定结构并且值相同。直接返回true
  • 如果两颗二叉树其中有一个不是空树,而另一个事空树,结构肯定不同,直接返回false。
  • 结构判断完了,就判断值,两个指针分别从两颗二叉树的祖宗节点同时开始遍历他们的左右子树,如果A二叉树和B二叉树的左子树节点有一个节点不相同返回false,如果左子树节点都相同,但是右子树节点不相同返回false。
    在这里插入图片描述
    代码如下:
 typedef struct TreeNode TreeNode;
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//两棵树都为空,结构相同且值相同if(p == NULL && q == NULL){return true;}//至少有一颗树不为空,那么如果其中有一颗树为空结构不相同if(p == NULL || q == NULL){return false;}if(p->val != q->val){return false;}return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
  • 如果左子树或右子树一直没找到不相同的节点,直到空节点两个肯定结构和值相同,说明左子树或右子树是一颗相同的二叉树就返回true。也就是第一个if

对称二叉树

题目描述

在这里插入图片描述

题目思路及代码

  • 是不是和上一道相同的二叉树有异曲同工之处。
  • 就是把A二叉树的左子树节点与B二叉树的右子树节点比较,把A二叉树的右子树节点和B二叉树的左子树节点比较即可。就是改变了比较位置。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/typedef struct TreeNode TreeNode;
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//两棵树都为空,结构相同且值相同if(p == NULL && q == NULL){return true;}//至少有一颗树不为空,那么如果其中有一颗树为空结构不相同if(p == NULL || q == NULL){return false;}if(p->val != q->val){return false;}return isSameTree(p->left, q->right) && isSameTree(p->right, q->left);
}bool isSymmetric(struct TreeNode* root) {return isSameTree(root->left, root->right);
}
  • 可以看到就是你走左,我走右。你走右,我走左
    在这里插入图片描述

另一棵树的子树

题目描述

在这里插入图片描述

题目思路及代码

  • 如果想要找另一个二叉树是否为这一个二叉树的子树,那么就要先找到与那个二叉树祖宗节点相等的节点。然后再两个二叉树同时递归比较。
  • 如果节与子树的祖宗节点相同,那么直接调用判断两个数是否相等的方法进行比较,不用再往子树递归。
  • 同理,如果第一个节点不和子树祖宗节点相等,那就先递归左子树,在左子树中找是否有相等的节点。如果没有,就递归右子树寻找
  • 如果递归遍历左右子树过程中,遍历到节点为NULL,说明左子树或右子树遍历完没找到与子树相同的节点。则左或右子树中没有匹配的节点。直接返回false。

在这里插入图片描述

typedef struct TreeNode TreeNode;
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL)  //若两颗树是空树,则一定结构且值相同{return true;}if(p == NULL || q == NULL)  //若两颗树其中一颗是空树,则一定结构且值不相同{return false;}if(p->val != q->val){return false;}return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root == NULL){return false;}if(isSameTree(root,subRoot)){return true;}return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);}
  • 这里||运算连接左右子树递归,就是左子树可能找不到,但是右子树可能找到。并且如果左子树找到了,右子树就不用找了。

二叉树的前序遍历

题目描述

在这里插入图片描述

题目思路及代码

  • 注意读题,我们是需要把二叉树的节点,按前序遍历的顺序存储在一个数组中。
  • 这个数组需要我们自己动态开辟,而如果要知道开辟多大空间,我们就需要二叉树一共有几个节点,这就可以用到链式二叉树讲的求节点个数算法。
  • 在前序遍历递归过程中,我们需要控制数组的下标来决定存储节点的位置,这时候下标最好作为一个参数传递,在每次函数递归开辟函数栈帧的时候,用指针来接受下标,保证形参一定会改变实参,从而影响到上一次递归的函数栈帧的下标发生改变。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
typedef struct TreeNode TreeNode;
int BinaryTreeSize(TreeNode* root)
{if(root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
void _preorderTravelsal(TreeNode* root, int *arr,  int* pi)
{if(root == NULL){return;}arr[(*pi)++] = root->val;_preorderTravelsal(root->left, arr, pi);_preorderTravelsal(root->right, arr, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {//先求出二叉树节点个数*returnSize = BinaryTreeSize(root);//动态开辟空间int* returnArr = (int*)malloc(sizeof(int) * (*returnSize));//为避免在原函数递归重复开辟空间和调用方法,写一个子函数int i = 0;_preorderTravelsal(root, returnArr, &i);return returnArr;
}
  • 中序遍历和后序遍历一样的思路,把arr[*(pi)++] = root->val,放在递归函数中间或递归函数之后。

二叉树的构建与遍历

题目描述

在这里插入图片描述

题目思路及代码

  • 按题目所说,我们需要将用户输入的先序遍历字符串按先序遍历的方式创建一个二叉树。然后我们再对构建的二叉树进行中序遍历。
  • 这就要看怎么构建了:

第一种构建方式:
在这里插入图片描述

  • 很明显C作为根节点a的右孩子并不满足是一个二叉树。

我们再来看看另一个构建方法:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 按照如果不是构建到空节点就一直按照根左右的顺序,先构建根节点,然后构建左孩子结点,构建到空节点后,空节点不可能作为子树的根节点,返回子树根节点开始构建右孩子节点。从下往上构建子树,最后构建完所以子树就是一颗先序遍历顺序构建的二叉树。

在这里插入图片描述

TreeNode* CreatNode(char* arr, int* pi)
{if(arr[*pi] == '#'){(*pi)++;return NULL;}TreeNode* root = buyNode(arr[(*pi)++]);//构建节点root->left = CreatNode(arr, pi);root->right = CreatNode(arr, pi);return root;
}
  • 这里为空节点就回上一次递归开始构建右孩子节点/但是不要忘了将这个遍历先序序列数组的指针后移,便于下一次的访问
  • 我们构建的同时就要开辟空间来存储节点,既然节点这么多。我们不妨封装一个函数来开辟空间存储节点。
TreeNode* buyNode(char x)
{TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));newnode->val = x;newnode->left = newnode->right = NULL;return newnode;
}
  • 构建完成就可以中序遍历了.
void InOrder(TreeNode* root)
{if(root == NULL){return;}InOrder(root->left);printf("%c ",root->val);InOrder(root->right);
}

下面是整体代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode
{char val;struct TreeNode* left;struct TreeNode* right;
}TreeNode;
TreeNode* buyNode(char x)
{TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));newnode->val = x;newnode->left = newnode->right = NULL;return newnode;
}
TreeNode* CreatNode(char* arr, int* pi)
{if(arr[*pi] == '#'){(*pi)++;return NULL;}TreeNode* root = buyNode(arr[(*pi)++]);root->left = CreatNode(arr, pi);root->right = CreatNode(arr, 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[100];scanf("%s", arr);//创建二叉树int i = 0;TreeNode* root = CreatNode(arr, &i);InOrder(root);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP LE学习笔记07 - MM与WM跨模块收货到仓库的流程中 如何实现 先上架再入库

上一章讲了LE中收货的一些特殊情况&#xff1a; 1&#xff0c;MM模块收货时&#xff0c;特别移动指标来标识的物料直接产生TO 2&#xff0c;MM中直接收货到仓库的固定Storage Bin(棚番)上 SAP LE学习笔记06 - MM与WM跨模块收货到仓库的流程中 带特别移动指标的物料也可以直接…

怎么将日常的文件做成二维码?文件二维码的在线转换方法

文件做成二维码来展示的应用场景越来越多&#xff0c;可以通过二维码在存储文件的同时&#xff0c;提供文件预览以及下载服务&#xff0c;并且二维码没有时效限制&#xff0c;能够长期提供内容展示服务&#xff0c;更符合现在的展示需求。那么文件生成二维码比较简单的方法可以…

黑屏环境下,如何利用OBD部署OceanBase企业版集群

一、前言 OBD&#xff0c;作为OceanBase官方推出的部署工具&#xff0c;显著简化了OB单机及集群的部署流程。此前&#xff0c;OBD能够支持对社区版OB进行一键部署&#xff0c;那OBD是否同样支持OB企业版的部署呢&#xff1f; 本文为大家介绍通过OBD&#xff0c;在OB企业版集群…

(最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)

&#xff08;最新&#xff09;华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—&#xff08;共12套&#xff09;&#xff08;每套四十题&#xff09; 岗位——硬件技术工程师 岗位意向——单板硬件开发 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0…

「青鸟」作家导演起飞计划,助人才转型,共铸电影市场新活力

2024年6月&#xff0c;《上海市电影高质量发展三年行动计划》发布「青鸟」作家导演起飞计划应运而生&#xff08;下文简称「青鸟计划」&#xff09;。作为全国首个协助作家跨界转型、用画面讲好故事的扶持平台&#xff0c;青鸟计划重视电影的文学性&#xff0c;通过专业人士搭建…

关于lua调用DLL的c/c++动态库(相关搜索:数据库)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

访问者模式详解

访问者模式 简介: 类的内部结构不变的情况下&#xff0c;不同的访问者访问这个对象都会呈现出不同的处理方式。 人话: 其实就是为了解决类结构不变但操作处理逻辑易变的问题&#xff0c;把对数据的操作都封装到访问者类中&#xff0c; 我们只需要调用不同的访问者&#xff0c;…

python脚本开头怎么写

在python开发的过程中&#xff0c;脚本开头非常重要。 第一行&#xff1a;告诉操作系统python装在哪里&#xff08;是通过env中查询&#xff0c;然后再调到对应的解析器完成运行&#xff09;。 第二行&#xff1a;是声明文件的编码格式以utf-8。 其他则为这个文件信息&#…

RTX5源码全家桶集成emWin6.40, Modbus主从,含FreeRTOS版, 探讨一种移植第3方组件通用方法以及使用注意事项2024-08-30

视频&#xff1a; https://www.bilibili.com/video/BV1tFHuenESf RTX5源码全家桶集成emWin6.40, Modbus主从&#xff0c;含FreeRTOS版, 探讨一种移植第3方组件的通用方法以及多任务使用注意事项 提纲&#xff1a; 参考资料: 1、例程下载 RTX5 All In One(2024-08-30 V2.0).7…

上海大面积断网?原因已查明

8月26日晚&#xff0c;上海电信向记者透露&#xff0c;2024年8月26日17:30许&#xff0c;上海电信城域网设备故障&#xff0c;导致上海电信部分宽带业务发生异常&#xff0c;影响全市范围部分云宽带用户业务&#xff0c;上海电信其他业务均不受影响。 经过上海电信全力抢修&…

医院建筑的电气设计——保障医疗质量与安全的坚固基石

医疗资源与水平的提升成为了衡量民生福祉的重要标尺。随着一批批新建医院及既有医院的华丽蜕变&#xff0c;从社区医院到综合医院&#xff0c;再到医疗城、医疗集聚区的崛起&#xff0c;不仅彰显了政府对民生健康的深切关怀&#xff0c;也预示着我国医疗体系正迈向智能化、高效…

PMP–知识卡片--迭代型生命周期

迭代指的是多次循环。例如&#xff0c;软件开发按照版本发布&#xff0c;每一个版本内部都是一个小的瀑布开发&#xff0c;都会经历“需求分析—设计—开发—测试—发布”周期&#xff0c;下一个迭代在此基础上重复这些步骤&#xff0c;对软件进行优化升级&#xff0c;发布新的…

Stable Diffusion majicMIX_realistic模型的介绍及使用

一、简介 majicMIX_realistic模型是一种能够渲染出具有神秘或幻想色彩的真实场景的AI模型。这个模型的特点是在现实场景的基础上&#xff0c;通过加入一些魔法与奇幻元素来营造出极具画面效果和吸引力的图像。传统意义的现实场景虽然真实&#xff0c;但通常情况下缺乏奇幻性&a…

信息技术(科技)老师资料大本营2024-8-31

(https://img-blog.csdnimg.cn/87e46b33da9640838ab2a76e3c7c9541.jpg)(https://img-blog.csdnimg.cn/e3099a265ef44365a50ec67acef35787.jpg)

5W爆了,建议紧盯这个方向!!

随着Python编程语言在各行业中的应用不断增加&#xff0c;Python程序员的需求也随之增长。 而爬虫技术可以说是Python应用最广泛也最实用的一个领域。在《2024python岗位调查报告》中&#xff0c;爬虫开发就有超过40%的占比。 近两年业界对爬虫技术服务的需求量一直在涨&#…

3个高效免费的文件恢复助手,数据恢复不再是难题

PC Inspector File Recovery PC Inspector File Recovery是一款功能强大的数据恢复软件&#xff0c;适用于Windows操作系统。该软件能够恢复磁盘、软盘、可移动磁盘等存储设备上的数据&#xff0c;支持多种文件系统&#xff0c;包括FAT12、FAT16、FAT32和NTFS。它不仅可以恢复因…

Excel基础应用

前置准备 前置插件&#xff1a;方方格子 chat8&#xff1a;chat8 Microsoft 365 帮助和学习&#xff1a;Microsoft 365 帮助和学习 基础 快捷键&#xff1a; ctrl1&#xff1a;设置单元格格式 ctrlH&#xff1a;替换 ctrle 智能填充 ctrlg 定位 字体变斜 颜色渐变 条件…

利用clip模型实现text2draw

参考论文 实践 有数据增强的代码 import math import collections import CLIP_.clip as clip import torch import torch.nn as nn from torchvision import models, transforms import numpy as np import webp from PIL import Image import skimage import torchvision …

2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题是由安全生产模拟考试一点通提供&#xff0c;起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特…

能大致讲一下Chat GPT的原理吗?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 话题群精选了三位网友的回答&#xff0c;从不同的角度阐释了Chat GPT的原理。 第一位网友的回答&#xff1a; 不给你扯长篇大论&#…