【二叉树 OJ题】二叉树基础知识 与 OJ题完成(二叉树构建与遍历问题,子树查找问题)

二叉树 !

二叉树概念与OJ题完成

  • 二叉树 !
    • 1 树
      • 1.1 树的概念
      • 1.2 树的相关概念
      • 1.3 树的表示方式
    • 2 二叉树
      • 2.1 二叉树的概念
      • 2.2 二叉树的构建
      • 2.3 特殊的二叉树
    • 3 二叉树OJ题的解决
      • 3.1 二叉树构建与遍历问题
        • 3.1.1 二叉树遍历
        • 3.1.2 二叉树构建
        • 3.1.3 题目完成
      • 3.2 子树查找问题
  • Thanks♪(・ω・)ノ
    • 下一篇文章见!!!

1 树

1.1 树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。
在这里插入图片描述

把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的

1.2 树的相关概念

1.节点的度:一个节点含有的子树的个数称为该节点的度;
2.叶节点或终端节点:度为0的节点称为叶节点;
3.非终端节点或分支节点:度不为0的节点;
4.双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
5.孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
6.兄弟节点:具有相同父节点的节点互称为兄弟节点;
7.树的度:一棵树中,最大的节点的度称为树的度;
8.节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
9.树的高度或深度:树中节点的最大层次; 如上图:树的高度为5
10.堂兄弟节点:双亲在同一层的节点互为堂兄弟;
11.节点的祖先:从根到该节点所经分支上的所有节点;
12.子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
13.森林:由m(m>0)棵互不相交的树的集合称为森林;

1.3 树的表示方式

一般来说最简单的想法是使用复杂链表结构

typedef int TreeData;
typedef struct TreeNode
{TreeData val;struct TreeNode* node1struct TreeNode* node2struct TreeNode* node3.........}treenode;

可以发现,这样设置无法应对所有结构,并且冗杂混乱。所以有位大佬发明了一种十分巧妙的办法:孩子兄弟表示法
每个节点只有两个指向,其一指向最左边的孩子节点,另一指向右边的兄弟节点。如此往复成功构建了树的结构。

typedef int TreeData;
typedef struct TreeNode
{TreeData val; // 结点中的数据域struct Node* firstChild1; // 第一个孩子结点struct Node* pNextBrother; // 指向其下一个兄弟结点
}treenode;

在这里插入图片描述

2 二叉树

2.1 二叉树的概念

一棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
    在这里插入图片描述
    注意:
    二叉树不存在度大于2的结点
    二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
    现实中的二叉树

2.2 二叉树的构建

相比一般的树来说,二叉树的构建就十分简单了,只需要左右两个节点即可。

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

多个节点串联即可构成一棵二叉树。

2.3 特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
    说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

3 二叉树OJ题的解决

3.1 二叉树构建与遍历问题

二叉树构建与遍历问题链接
在这里插入图片描述
该OJ题存在两个子问题,分别是二叉树构建和二叉树遍历。

3.1.1 二叉树遍历

我们首先解决遍历问题,遍历是构建的基础。
首先,二叉树的遍历主要有三种:

  1. 前序遍历: 先打印父节点 ,然后打印左子树,最后打印右子树。
  2. 中序遍历:先打印左子树,然后打印父节点,最后打印右子树。
  3. 后序遍历:先打印左子树,在打印右子树,最后打印父节点。
    假如有这样一棵树(题目所给)
    在这里插入图片描述

我们分别用前序遍历,中序遍历,后序遍历演示一遍。是这样的,然后我以前序遍历为例剖析一下结构。
在这里插入图片描述

前序解剖为
在这里插入图片描述
一层套一层,层层递归。
代码实现也非常简单

typedef char BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;
void BinaryTreePrevOrder(BTNode* root){if(!root) {printf("# ");return;}printf("%c ",root->data);//打印父节点BinaryTreePrevOrder(BTNode* root->left);//遍历左子树BinaryTreePrevOrder(BTNode* root->right);//遍历右子树
}

中序遍历和后序遍历只需要调换最后三行代码相对位置即可。

3.1.2 二叉树构建

题目给我们的输入样式为
输入:abc##de#g##f###(前序遍历)
‘#’表示空格,可以理解为二叉树里的空节点NULL。
‘字母’表示每个节点储存的数据
我们只要层层遍历,遇到‘#’记作NULL,反之记录节点数据,并依次遍历左子树,右子树。我们使用‘pi’为下标来完成数组的读取操作。

typedef char BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;TreeNode* treecreate(char* str,int* pi){if(str[*pi] == '#'||str[*pi]=='\0') {(*pi)++;return NULL;}//'#'和‘\0’记作NULL//不为空则创建新节点TreeNode* node =(TreeNode*)malloc(sizeof(TreeNode));node->data=str[*pi];(*pi)++;//数组下标增加//遍历左子树node->left = treecreate(str, pi);//遍历右子树node->right = treecreate(str, pi);//返回当前节点return node;
}int main() {  char str[100] = "\0";scanf("%s",str);int pi = 0;//记录下标//二叉树创建TreeNode* root = treecreate(str,&pi);return 0;
}
3.1.3 题目完成

根据上面两个子问题我们就解决了该OJ题
在这里插入图片描述

3.2 子树查找问题

子树查找问题链接
在这里插入图片描述
这道题我一开始的想法是检查对应每一个节点,每次只能取出一棵树中的一个节点的数据,再取出另一棵树的节点数据进行比较。但是后来发现,这种思路是非常麻烦、非常不可行的思路。

首先我完成基本的检查工作:

  1. 都为空则相同
  2. 其一为空则不同
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(!root&&!subRoot) return true;//如果都为空,则相同if(!root) return false;//在第一条前提下 root为空肯定是假if(!subRoot) return false;//在第一条前提下 subRoot为空也肯定是假
}

这三条可以完成一个基本的判定。
然后我们看看如何检查子树是否存在。这个思路也很清晰:
3. 都为空则相同
4. 其一为空 则不同
5. 数据不同 则不同
6. 递归检查左右子树,必须都为真才可以

bool issame(struct TreeNode* root, struct TreeNode* subRoot){if(!root&&!subRoot) return true;if(!root) return false;if(!subRoot) return false;if(root->val != subRoot->val) return false;return issame(root->left,subRoot->left) && issame(root->right,subRoot->right);}

最后关键一步是这一行代码

return issame(root,subRoot) || isSubtree(root->left,subRoot) ||isSubtree(root->right,subRoot);
  1. 如果issame检查返回真,则存在。
  2. 如果左右子树的isSubtree返回真,则存在
    主要还是issame函数的作用,后面两个isSubroot是为了防止root为空了无法正确判断来补充。
    完整代码
bool issame(struct TreeNode* root, struct TreeNode* subRoot){if(!root&&!subRoot) return true;if(!root) return false;if(!subRoot) return false;if(root->val != subRoot->val) return false;return issame(root->left,subRoot->left) && issame(root->right,subRoot->right);}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(!root&&!subRoot) return true;if(!root) return false;if(!subRoot) return false;return issame(root,subRoot) || isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);}

Thanks♪(・ω・)ノ

下一篇文章见!!!

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

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

相关文章

玩转 TableAgent 数据智能分析

一、什么是数据智能分析&#xff1f; 数据智能分析是指利用先进的技术和工具对大量数据进行收集、整理、分析和挖掘&#xff0c;以获取有益的信息和见解。这种分析通常涉及人工智能、机器学习、数据挖掘和统计分析等技术&#xff0c;旨在揭示数据背后隐藏的模式、关联和趋势&a…

每日OJ题_算法_滑动窗口②_力扣3. 无重复字符的最长子串

目录 力扣3. 无重复字符的最长子串 解析代码 力扣3. 无重复字符的最长子串 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 难度 中等 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcb…

【普中】基于51单片机简易计算器数码管显示设计( proteus仿真+程序+实物演示+讲解视频)

【普中开发板】基于51单片机简易计算器数码管显示设计( proteus仿真程序实物演示讲解视频&#xff09; Proteus 仿真&#xff1a;Proteus 8.16(有低版本) 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P04 1. 主要功能&#xff1a…

GAMES101-Homework4

原理&#xff1a;就是上张图片 //该段代码表示四个点的情况&#xff0c;相当于举例子去计算上诉的公式 void naive_bezier(const std::vector<cv::Point2f> &points, cv::Mat &window) {auto &p_0 points[0];auto &p_1 points[1];auto &p_2 poi…

双碳目标下基于“遥感+”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践应用

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

Flink系列之:ORDER BY语句和LIMIT语句

Flink系列之&#xff1a;ORDER BY语句和LIMIT语句 一、ORDER BY语句二、LIMIT语句 一、ORDER BY语句 适用于流、批一体 ORDER BY 子句使结果行根据指定的表达式进行排序。 如果两行根据最左边的表达式相等&#xff0c;则根据下一个表达式进行比较&#xff0c;依此类推。 如果…

AI数字人直播问题及解决方案!

青否数字人SaaS系统&#xff08;数字人源码&#xff1a;zhibo175&#xff09;目前支持哪些平台使用数字人直播 目前支持的平台有&#xff1a;抖音、快手、视频号、淘宝/天猫、京东、小红书、拼多多&#xff0c;哔哩哔哩&#xff0c;tiktok&#xff0c;阿里国际站&#xff0c;用…

设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析

工厂模式介绍 工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…

网络管理员推荐的网络监控软件-OpManager

网络是企业背后的基础&#xff0c;这些网络可帮助企业将信息保存在一个集中位置&#xff0c;需要并限制所有其他入站请求的人都可以访问。那么&#xff0c;如何提供持续的一流最终用户体验并维护快速发展的网络呢&#xff1f;只有借助可靠的实时网络监控工具&#xff0c;才能监…

GAN 介绍

介绍 生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;简称GANs&#xff09;是一种深度学习模型&#xff0c;由Ian Goodfellow于2014年提出。GAN由两个神经网络组成&#xff0c;一个生成器&#xff08;Generator&#xff09;和一个判别器&#xff08;Dis…

nodejs配置express服务器,运行自动打开浏览器

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 设置方法&#xff1a;1&#xff0c;安装nodej…

python实现一张图片按指定宽高截取成多张图片

1、导入所需的包 import os from PIL import Image 2、获取源图片 path_img image img_dir os.listdir(path_img) 3、循环读取源图片并按指定宽高进行自动截图保存 for i in range(len(img_dir)):id img_dir[i].split(.)[0]img Image.open(path_img / img_dir[i])si…

【C++高阶(七)】C++异常处理的方式

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 异常处理的方式 1. 前言2. C语言处理异常的方式…

Transformer架构详解

文章目录 引言1. Transformer架构详解1.1 编码器与解码器1.1.1 编码器&#xff08;Encoder&#xff09;1.1.2 解码器&#xff08;Decoder&#xff09; 2. 核心代码2.1 自注意力&#xff08;Self-Attention&#xff09;机制2.2 多头注意力&#xff08;Multi-Head Attention&…

Redhat LINUX 9.3 + PG 16.1 搭建主备流复制

一直想搭建一个PG流复制&#xff0c;最近正好有一个新环境&#xff0c;操作系统是最新的,rhel 9.3&#xff0c;数据库是最新的 pg 16.1,借鉴了网上的步骤&#xff0c;尤其是小工到专家的内容&#xff0c;在此谢过。 1.安装环境 1&#xff09;IP: 主&#xff1a;192.168.133.151…

Python PIP安装pycorrector、kemln报错

本来想装个pycorrector用一下&#xff0c;结果在安装其依赖包kemln的时候疯狂报错&#xff0c;报错关键词包括但不限于Bash、Cmake&#xff0c;C啥的&#xff0c;搜了很多文章&#xff0c;终于摸索到了安装的办法。 1、安装bash 去官网https://gitforwindows.org/下载bash&am…

消费者痛点怎么分析,不同行业如何营销

消费者的痛点是品牌营销中的关键因素&#xff0c;因为准确把握消费者的痛点&#xff0c;可以为品牌带来更大的市场机会。今天和大家探讨下消费者痛点怎么分析&#xff0c;不同行业如何营销&#xff1f; 今天我们会从分类、洞察、场景分析、分级与评判以及不同行业细分的角度来进…

neuq-acm预备队训练week 9 P8604 [蓝桥杯 2013 国 C] 危险系数

题目背景 抗日战争时期&#xff0c;冀中平原的地道战曾发挥重要作用。 题目限制 题目描述 地道的多个站点间有通道连接&#xff0c;形成了庞大的网络。但也有隐患&#xff0c;当敌人发现了某个站点后&#xff0c;其它站点间可能因此会失去联系。 我们来定义一个危险系数 DF…

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类&#xff0c;它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法&#xff0c;传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…

环境搭建及源码运行_java环境搭建_maven

书到用时方恨少、觉知此时要躬行&#xff1b;拥有技术&#xff0c;成就未来&#xff0c;抖音视频教学地址&#xff1a;​​​​​​​ ​​​​​​​ 1、介绍 1&#xff09;管理项目依赖和版本 统一的项目依赖和版本管理 ​​​​​​​​​​​ 2&#xff09;Maven支持多模块…