【数据结构】二叉树OJ练习

简介: 【数据结构】二叉树OJ练习

一、二叉树的最小深度


链接111. 二叉树的最小深度


描述


给定一个二叉树,找出其最小深度。


最小深度是从根节点到最近叶子节点的最短路径上的节点数量。


说明:叶子节点是指没有子节点的节点。


示例1

b369d72262ac946d3a9dbc5b1520f90f.jpeg

输入:root = [3,9,20,null,null,15,7]
输出:2


示例2

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5



提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

思路

这里的二叉树有两种情况 同时具有左右子树只具有左子树或右子树

1b07416d8593613b703ac2f4f7f1f9d7.png


对于 同时具有左右子树的情况 非常简单,可以借鉴上篇文章中我们求最大深度的接口的思路。

我们递归遍历到最后一层,返回较小的高度 + 1。每次遍历分别计算左右子树的高度,防止多次递归调用。


如果遇到 NULL 则返回0。


对于 只有单边子树 的情况就比较麻烦了,由于没有一边的子树,我们肯定是返回有子树的一边的高度。

但是如果套用 同时具有左右子树的情况 就不行了,到时候本来应该返回有子树的那一边,但是返回的总是1。


所以需要 两种情况分别处理 :


   首先求出左右子树高度和 左右子树中的最小高度。


   如果 当前树有左右子树 则返回最小高度 + 1;


   如果 当前树的左右子树为空 那么就返回 左边高度 + 右边高度 + 1,因为 有一边的高度必定为0,所以加上的高度并不影响正确结果。


4acb8f149b5f6e688b4114031a1765e1.png



二、单值二叉树


链接965. 单值二叉树


如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。


只有给定的树是单值二叉树时,才返回 true;否则返回 false


示例1

screen-shot-2018-12-25-at-50104-pm.png

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

screen-shot-2018-12-25-at-50050-pm.png


输入:[2,2,2,5,2]
输出:false


提示:

   给定树的节点数范围是 [1, 100]。

   每个节点的值都是整数,范围为 [0, 99] 。


思路:


单值树就是每个节点的值都相同。


而一棵树是单值树,那么它的 根节点的值和左右子树的值一定相同,那么就可以拆分成子问题。

接下来判断各种情况:


   如果 节点为空 ,那么是单值二叉树,返回真;

   如果 左子树不为空且值 和 根节点值不相等 ,返回假;

   如果 右子树不为空且值 和 根节点值不相等, 返回假;


就这样分别递归左右子树,即可判断是否为单值二叉树。


a49a36bf56a02a51a53592bd71085fb2.png



三、相同的树


链接100. 相同的树


描述

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。


示例 1

2a27669123cf48ac4ba9803a33825919.jpeg

输入:p = [1,2,3], q = [1,2,3]
输出:true


示例2

e020eba7742fa7e58b8ed716c16f4374.jpeg

输入:p = [1,2], q = [1,null,2]
输出:false


示例3

ee4fb2e327ede5f03eb8e9f4ec08e0b8.jpeg


提示:

   两棵树上的节点数目都在范围 [0, 100] 内

   -104 <= Node.val <= 104


思路:


判断两棵树是否相等,我们先思考一下如何才算相等:


   对于 两棵空树 ,必定相等,返回真;

   如果 一棵树空,另一棵树不为空 ,那么不相等,返回假;

   如果 树中值相同但是结构不同 ,那么也不相等,返回假;

   如果 两棵树对应节点的值不相等,那么也不相等,返回假;


那么只要分别递归两棵的左右子树,如果一直递归到底都是真,且左右子树返回的结果都为真,那么这两棵树就相同。


4ba7d58b51d3ebe5d4364722e36f0381.png




相关文章
|
14天前
|
存储 机器学习/深度学习
【数据结构】二叉树全攻略,从实现到应用详解
本文介绍了树形结构及其重要类型——二叉树。树由若干节点组成,具有层次关系。二叉树每个节点最多有两个子树,分为左子树和右子树。文中详细描述了二叉树的不同类型,如完全二叉树、满二叉树、平衡二叉树及搜索二叉树,并阐述了二叉树的基本性质与存储方式。此外,还介绍了二叉树的实现方法,包括节点定义、遍历方式(前序、中序、后序、层序遍历),并提供了多个示例代码,帮助理解二叉树的基本操作。
38 13
【数据结构】二叉树全攻略,从实现到应用详解
|
11天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
11天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
1月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
1月前
|
存储
【初阶数据结构篇】实现链式结构二叉树(二叉链)下篇
要改变root指针的指向,将本来指向根节点的root指针改为空,所以传二级指针(一级指针也可以,只不过在调用完记得把root置为空)。
|
1月前
|
存储 测试技术
【初阶数据结构篇】实现链式结构二叉树(二叉链)上篇
先构建根结点,再对左右子树构建,每次需要时申请一个结点空间即可,否则返回空指针。
|
9天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
12天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
14 0
【数据结构】栈和队列的深度探索,从实现到应用详解