一些二叉树相关面试题

本文探讨了与二叉树相关的算法问题,包括如何判断是否为平衡二叉树、搜索二叉树,计算二叉树的直径,以及寻找最大二叉搜索树。此外,还涉及了完全二叉树的递归判断方法,并提出了解决公司派对最大快乐值的策略,该策略基于员工层级关系和快乐值的多叉树模型。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1. 对折

在这里插入图片描述
这个大家可以自己用纸对折一下,我这里就简单的说一下:
在这里插入图片描述
这是我们第一次对折的情况。然后我们进行第二次对折:
在这里插入图片描述
这是我们第二次对折,我们再第三次对折:
在这里插入图片描述
如果我们把它转换成树的形状,我们可以这样:
在这里插入图片描述
如果我们想从上到下打印,其实就是中序遍历。

代码实现
从上图中我们可以发现一些规则:1. 头结点的凹的。2. 所有左子树的根是凹的,所有右子树的根是凸的。3. 对折几次就有几层
在这里插入图片描述
这个打印函数第一个参数说明当前是第几层,第二个参数是对折了几次(总共有几层),第三个参数意思是:当前结点的凹的话,down=true,如果是凸的话,down=false

在这里插入图片描述
如果i>N的话说明超过了总层数,就返回。
我们先往左边递归,当递归到左边最后一个的时候,返回,然后打印此时的down。再往右边递归,形成一个中序遍历。

2. 判断是否是平衡二叉树

在这里插入图片描述
难度 简单 题目链接

解题思路:
我们要判断一棵树是否是平衡二叉树,我们就要用一些变量来记录它的状态。在平衡二叉树中,我们可以用高度来衡量。
第一步:我们用结构体先定义一个信息体
在这里插入图片描述
一个记录当前结点的高度,一个记录这个树是否平衡。

第二步:判断是不是空树
在这里插入图片描述
如果是空树,我们就返回true,高度为0。不为空,就递归到左子树和右子树。

第三步:递归回来,判断此树是否为平衡二叉树
在这里插入图片描述
我们先认为它是平衡的,如果子树不满足条件的话,就设置成false。然后返回此树的一个情况。
在这里插入图片描述
在主函数直接返回这个树的一个平衡状态就行了。

3. 判断是否是搜索二叉树

在这里插入图片描述
难度 中等 题目链接

解题思路:
那么我们要判断是否是搜索二叉树,也可以定义一个信息体来记录一些条件信息。这里,我们要找左子树的最大值和右子树的最小值。但是递归需要传递的信息是一样的,所以不论是左子树还是右子树,我们都把两边的最小值和最大值找出来。
在这里插入图片描述
在这里插入图片描述
这里空树不知道返回什么,我们就返回空。然后返回到上层的时候,再做处理。当递归回来的时候,我们就要判断当前结点为根的树是否是搜索二叉树:
在这里插入图片描述
然后,我们再把以当前结点为根的树的最大值和最小值算出来返回。
在这里插入图片描述

4. 二叉树的直径

在这里插入图片描述
难度 简单 题目链接

示例:
在这里插入图片描述
这道题首先分几种情况:
第一种情况:和根结点无关
在这里插入图片描述
这种情况最大距离是在左子树或右子树中。

第二种情况:和根结点有关
在这里插入图片描述
这种情况的最大距离是:左子树的高度+右子树的高度。

代码实现:
在这里插入图片描述
首先还是先构造出信息体:最大距离和高度
在这里插入图片描述
当递归回来时,我们判断三种可能性:
在这里插入图片描述
选出这三种可能性最大的那个:
在这里插入图片描述
最后把max和高度求出来,然后返回:
在这里插入图片描述

5. 寻找最大二叉搜索树

这道题是什么意思,举个例子大家看一下:
在这里插入图片描述
这样的一个树,它自己本身不是一颗搜索二叉树,但是它的左子树和右子树是搜索二叉树,它的左子树的结点是4,右子树的结点是3。所以最大搜索二叉树结点个数就是4。

解题思路:
情况一:最大二叉搜索树不是以此结点为根

那么最大二叉搜索树就在此结点左子树或右子树中。

情况二:最大二叉搜索树是以此结点为根
那么我们首先要判断:
1.左子树和右子树是否是二叉搜索树。
2.左子树的max<x,右子树的min>x。
3.左子树的size+右子树的size+自己

下面我们可以创建一个信息体:
在这里插入图片描述
这里的第一个其实可以省略,如果整棵树的个数和最大二叉搜索树的个数相等,就说明此树是二叉搜索树。我们就可以简写:
在这里插入图片描述
然后继续按照之前的套路:
在这里插入图片描述
当递归回来时,我们把以此根为树的四个信息计算出来,然后返回。
在这里插入图片描述
这三个信息比较简单,我们还差最大二叉搜索树的个数:
在这里插入图片描述
然后比较这三种情况,最大的返回。
在这里插入图片描述

6. 用递归套路判断是否是完全二叉树

在这里插入图片描述
难度 中等 题目链接

那么我们首先还是要把所有的可能性列举出来:
第一种情况:左子树是满二叉树,右子树是满二叉树,左子树高度==右子树高度
在这里插入图片描述
第二种情况:左子树是完全二叉树,右子树是满二叉树,左子树高度=右子树高度+1
在这里插入图片描述
第三种情况:左子树是满二叉树,右子树是满二叉树,左子树高度=右子树高度+1
在这里插入图片描述
第四种情况:左子树是满二叉树,右子树是完全二叉树,左子树高度==右子树高度
在这里插入图片描述
还是和前面一样,先写信息体:
在这里插入图片描述
然后就按照我们之前分析的情况来判断:
在这里插入图片描述

7. 派对的最大快乐值

题目:
一个公司现在要办party,你可以决定哪些员工来,哪些员工不来。
规则:
1.如果某个员工来了,那么这个员工的所有下级都不能来。
2.派对的整体快乐值是所有到场员工快乐值的累加。
3.你的目标是让派对的整体快乐值最大

给定一棵多叉树的头节点boss,请返回派对的最大快乐值

公司的每个员工都符合Employee类的描述。整个公司的人员结果可以看作是一颗标准的,没有环的多叉树。树的头结点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。叶结点是没有任何下属的基层员工,除基层员工外,每个员工都有一个或多个直接下级

员工信息的定义如下:

//员工的信息定义
struct Employee
{
	int _happy;//这名员工可以带来的快乐值
	list<Employee> subordinates;//这名员工的直接下级
};

举个例子:
在这里插入图片描述
这是一颗多叉树,如果我们选了第一层的结点,第二层就不能选,但是可以选第三层。如果我们选择了第二层,就不能选第一层和第三层了。然后,根据这样的规则把选出所有人的最大值找出。

首先,我们分析可能性:
第一种情况:根结点来
根结点的happy值+下级成员不来的最大值
在这里插入图片描述
这里的意思就是x的happy+a不来的最大happy+a不来最大happy值+a不来最大happy值+c不来最大happy值。

第二种情况:根结点不来
把下级成员来的happy值和不来的happy值进行比较,选出最大的
在这里插入图片描述
这个意思是max(a来,a不来)+max(b来,b不来)+max(c来,c不来)。

代码实现:
那么我们就先写信息体:其实就两个,来的最大值和不来的最大值
在这里插入图片描述
然后我们就需要写递归体:
在这里插入图片描述
这里是先遍历当前结点的所有下级员工,然后递归下去,把最下面一层的员工来与不来的最大值算出。然后就会递归上去,再统计出。
在这里插入图片描述
最后就得出答案。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python二叉树面试题有很多种,以下是其中几个常见的面试题: 1. 二叉树的最大深度:这个问题要求计算给定二叉树的最大深度。可以使用递归的方法来解决,递归函数的定义是返回当前节点的深度,递归终止条件是节点为空时返回0,递归过程中比较左右子树的深度并返回较大值加1。时间复杂度为O(n),空间复杂度为O(n)。 2. 二叉树的前序遍历:这个问题要求按照前序遍历的顺序输出二叉树的节点值。可以使用递归或迭代的方法来解决。递归方法的思路是先输出当前节点的值,然后递归遍历左子树,最后递归遍历右子树。迭代方法可以使用栈来辅助实现,把根节点压入栈中,然后循环弹出栈顶节点,输出其值,并将其右子节点和左子节点依次压入栈中。时间复杂度为O(n),空间复杂度为O(n)。 3. 二叉树的层序遍历:这个问题要求按照层序遍历的顺序输出二叉树的节点值。可以使用队列来辅助实现。首先将根节点入队,然后循环直到队列为空,每次从队列中取出一个节点,输出其值,并将其左右子节点依次入队。时间复杂度为O(n),空间复杂度为O(n)。 以上是几个常见的Python二叉树面试题的解法,根据具体的问题要求和输入条件选择合适的解法即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【编程之路】面试必刷TOP101:二叉树系列(23-30,Python实现)](https://blog.csdn.net/be_racle/article/details/125531755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【面试题8】二叉树的下一个节点](https://download.csdn.net/download/weixin_38589168/14035034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值