数据结构(Java)——Day14(二叉树的OJ题目练习1)

一、复习

二、二叉搜索树(二叉查找树) BST

1. 定义:

(1)左子树的所有值< 根节点 < 右子树的所有值,且为递归定义的

(2)一般来说不保存重复节点(JDK中的搜索树实现也不保存重复节点)

2. 图示

3. 二叉搜索树的搜索效率:log(n)数量级

4. 二叉搜索树的中序遍历结果:在BST中,中序遍历的结果集一定是一个升序序列(这个可以用来判断一棵树是否满足二叉搜索树的定义)

如上图中的中序遍历结果为:1,3,4,5,6,7,9,11

三、二叉树相关OJ题目

1. 相同的树:100. 相同的树 - 力扣(Leetcode)

(1)思路:

A. 树相同:树的节点的结构相同,节点对应的值都相同

B. 代码逻辑:递归,前驱遍历

a.函数语义:给定两个树的树根p和q就能判断两棵树是否相同

b. 人脑思路

<1>首先看两个树的树根是否相同:

结构上相同:当p为空,q也为空,则一定相同;若一个为空一个不为空,则肯定不相同

结构相同,则比较根节点的值是否相同

//走到这说明,两个树的根节点完全相同,递归的调用去判断p和q的左子树是否相同,右子树是否相同

<2>然后判断p的左子树和q的左子树是否相同,不等,直接false

<3>然后判断p的左子树和q的左子树是否相同,  不等,直接false

<4>走到这还没有返回,则说明两个树相同,返回true

(2)代码实现:

 2. 另一棵树的子树:572. 另一棵树的子树 - 力扣(Leetcode)

(1)思路:前序遍历,递归

A. 函数语义:给定一个root和subRoot,就能判断以root为根的树是否包含以subRoot为根的树

B. 代码逻辑:

a. 首先判断以root为根的树是否和subRoot为根的树相同,调用题目1的函数即可,如果相同则直接返回true即可

b. 递归调用函数,判断是否以root为根的左子树是否包含subRoot 或者 递归调用函数,判断是否以root为根的右子树是否包含subRoot

注意:b中两个关系是或者的关系,只要有一边包含则返回true即可

(2)代码实现:

3. 翻转二叉树:226. 翻转二叉树 - 力扣(Leetcode)

(1)思路:后序遍历,递归

A. 函数语义:给定一个以root为根的树,就能翻转这个树,并返回根节点

B. 递归逻辑:

a. 要想翻转一个以root为根的树首先要翻转其左子树的所有节点

b. 然后需要翻转其右子树的所有节点

c. 最后只需要交换翻转好的左右子树,则翻转完成

C. 图示:


(2)代码实现:

 4. 判断一个树是否是平衡二叉树

(1)思路:

A. 什么是平衡树,一个二叉树每个节点左右两个子树的高度之差不超过1

B. 代码思路:采用前序遍历+递归

a. 函数语义:给定一个root,就能判断以root为根的树是否是平衡二叉树

b. 递归思路

<1>. 当一个节点不为空的时候则需要判断是否满足平衡二叉树的定义,通过求解其左右子树的高度差,如果满足高度差的绝对值大于1,则直接返回false

<2> 走到这说明这个这个节点满足平衡二叉树定义,需要判断其左右子树是否都满足平衡二叉树的定义,因此递归调用

(2)示例代码:

5. 对称二叉树(什么叫轴对称,值相同且结构相同)101. 对称二叉树 - 力扣(Leetcode)

(1)思路:递归

A. mirror函数语义:传入两个树根t1和t2,就能判断这两棵树是否是轴对称的

B.  递归思路:

a. 当t1和t2都为空,则一定是对称的树

b. 当t1,t2只有一个为空,则一定不是对称的树

c. 当t1和t2不为空,则首先要判断t1和t2的根节点值是否相等。若相等,则判断它t1.left和t2.right是否是轴对称的 && t2.right和t1.left是否是轴对称的。

C. isSymmetric函数:判断是否一个树是对称的就是判断这个树的左右子树是否是轴对称的

注意:实际上这个结构对称体隐含在isMirror函数的递归调用的参数中了,即为上述的c

(2)代码实现:

6. 二叉树的层次遍历102. 二叉树的层序遍历 - 力扣(Leetcode)

(1)人脑思路:利用队列辅助实现,循环

A. 如何使用队列进行层次遍历

首先让root进入队列(保证循环能够进入)

然后依次让节点出队,将节点的值添加到遍历序列中,如果出队节点有子节点,则让起子节点按照左右的顺序依次入队。

当队列为空的时候(循环的结束条件),完成层次遍历

B. 如何确定每一层的节点个数(内部循环的结束条件):当处理该层之前队列的size(有效元素个数)就是该层的节点个数。

原因:因为每次出队的时候都将其子节点入队,即一层处理完毕,则队列中的节点就是下一层待遍历的节点,自然size也就是下一层的节点个数了

例如:最开始的时候size == 1,则该层的元素个数为1...

(2)代码实现:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值