树算法题解析

二叉树按层遍历并收集节点

1.获取此层的size
2.循环size次:将本次数值添加到list中,并依次将左(先),右(后)添加到Queue中

平衡搜索二叉树

平衡二叉树
定义:每一颗子树,左高-右高≤1
解析:每次返回当前节点的高度和是否平衡的信息
高度计算:在左数的高度和右数的高度取最大值再加1
是否平衡:1.左树平衡2.右树平衡3.左数的高度减上右数的高度<2

搜索二叉树
定义:对于每一个节点来说,每一个左树都比我小,每一个右树都比我大
中序遍历严格递增,必然是搜索二叉树,反之也成立

分析:定义一个对象,对象分为三个参数:max,min,是否是搜索二叉树,
max,min:先定义最小值和最大值都是这个数本身,拿左树的最大(小)值和右树的最大(小)值跟现有的max,min做比较取值
是否是搜索二叉树:左右树都是搜索二叉树,并且左树的最大值小于传入的数值,右树的最小值大于传入的数值

能否组成路径和

定义:给定一个数,返回一个二叉树,能否返回一条路径(从头到尾,不能中断,要到叶节点 )上所有节点的值的和等于这个数
分析:为叶节点,叶节点加上之前相加总和等于这个数,则为true,
不为叶节点,加上本次值,当左节点/右节点不为空时,回调

收集达标路径和

定义:给定一个数,返回所有等于这个数的路径
分析:定义一个方法,方法的入参为(当前节点,当前路径,presum,sum,结果大list)
1.判断是否是叶节点,如果是叶节点,并且路径和等于sum,则当前路径加上此节点,总list加上copy(当前路径),当前路径减去当前节点,返回,不是叶节点直接返回
2.不是叶节点,presum加上当前数,当前路径加上当前节点,判断左/右节点是否不为空,回调,当前路径删除此节点

前缀树

1)单个字符串中,字符从前到后的加到一棵多叉树上
2)字符放在路上,节点上有专属的数据项(常见的是pass和end值)
3)所有样本都这样添加,如果没有路就新建,如有路就复用
4)沿途节点的pass值增加1,每个字符串结束时来到的节点end值增加1
设计一种结构。用户可以:
1)void insert(String str) 添加某个字符串,可以重复添加,每次算1个
2)int search(String str) 查询某个字符串在结构中还有几个
3) void delete(String str) 删掉某个字符串,可以重复删除,每次算1个
4)int prefixNumber(String str) 查询有多少个字符串,是以str做前缀的

二叉树的先序、中序、后序遍历

先序:任何子树的处理顺序都是,先头节点、再左子树、然后右子树

中序:任何子树的处理顺序都是,先左子树、再头节点、然后右子树

后序:任何子树的处理顺序都是,先左子树、再右子树、然后头节点

非递归方式实现二叉树的先序、中序、后序遍历

1.先序遍历:先把头节点压入栈,栈顶出来为cur,有右压入右,有左压入左
2.中序遍历:2.1当前节点为cur,以cur为头的左数全部压入栈直到为空,2.2栈中弹节点打印,节点右孩子为cur 2.3栈为空停止
3.后序遍历:把先序遍历的结果压入一个栈,再弹出

实现二叉树的按层遍历

解析:创建一个队列,先将头节点放进队列,出队列,有左放左,有右放右

实现二叉树的序列化和反序列化

解析:将二叉树携程一个String,用逗号隔开,为null的用占位符代替

请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。 如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。 给定一个输入参数N,代表纸条都从下边向上方连续对折N次。 请从上到下打印所有折痕的方向。

例如:N=1时,打印: down N=2时,打印: down down up
解析:折纸的折痕可以看做是一个以凹折痕为头的二叉树,每次折纸都会在两端折痕处多一个上凹下凸的折痕,
而打印折痕就是做一个中序遍历的打印

Leetcode 431. Encode N-ary Tree to Binary Tree

解析:将多叉数的孩子都放在二叉树以多叉树head为头的左数的右孩子上

求二叉树最宽的层有多少个节点

解析:准备5个变量:当前节点,当前层结束节点,下一层结束节点,最大层数,当前层节点数

给你二叉树中的某个节点,返回该节点的后继节点

二叉树结构如下定义:
Class Node {
V value;
Node left;
Node right;
Node parent;
}
定义:后继节点就是中序遍历中,当前节点的下一个节点
解析:分为两种情况:1.没有右树,后继节点就是右树的第一个子节点
2.有右树,往上找父亲,当找到某一个父亲是它父亲的左孩子停止,它就是后继节点

判断二叉树是否是完全二叉树

解析: 分为两种情况:1.有右树没有左树,肯定不是完全二叉树
2.遇到左右不双全的,剩下的节点必是叶节点

给定一棵二叉树的头节点head,任何两个节点之间都存在距离, 返回整棵二叉树的最大距离

解析:分为两种情况:1.经过头节点:最大距离就是求左树的高度+右树的高度+1
2.不经过头节点:就是求左树的最大距离或右树的最大距离
这两种情况求最大值

给定一棵二叉树的头节点head,返回这颗二叉树是不是满二叉树

解析:就是看这颗数的size是否等于2^n-1

给定一棵二叉树的头节点head, 返回这颗二叉树中最大的二叉搜索子树的大小

解析:二叉树的递归套路
1.向每一个节点获取最大搜索子树的大小,子树总大小,最小值,最大值

判断二叉树是否是完全二叉树,如何用递归套路来解这个题

解析:分为四种情况:1.左满,右满
2.左完全,右满,左高右高+1
3.左满,右满,左高
右高+1
4.左满,右完全,左高==右高

给定一棵二叉树的头节点head,和另外两个节点a和b。返回a和b的最低公共祖先

解析:分为两种情况:1.x是答案
1.1左右各一个
1.2x是a,左右b
1.3x是b,左右a
2.与x无关
2.1左有答案
2.2右有答案
2.3a,b不全

派对的最大快乐值

定义:员工信息的定义如下:
class Employee {
public int happy; // 这名员工可以带来的快乐值
List subordinates; // 这名员工有哪些直接下级
}
公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树。树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。 叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外,每个员工都有一个或多个直接下级。
这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则:
1.如果某个员工来了,那么这个员工的所有直接下级都不能来
2.派对的整体快乐值是所有到场员工快乐值的累加
3.你的目标是让派对的整体快乐值尽量大
给定一棵多叉树的头节点boss,请返回派对的最大快乐值。

条件:上下级只能去一个
解析:定义一个类,收集每一层不包含自己的最大快乐值,和包含自己的最大快乐值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值