代码随想录——二叉树 刷题记录

二叉树的遍历DFS

144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历

递归

前中后序分别按顺序调用函数就好,左右孩子递归

迭代(非递归)

用栈

  1. 前序
    按照“中-右-左”进栈,每次弹出节点记录到数组然后右左孩子入栈。
  2. 中序
    比较复杂可以重做
    循环条件是栈不空或者当前节点不空,如果当前节点不空,入栈并移动指针到左孩子;如果当前节点为空,出栈,指针移动到出栈节点,记入数组,指针移动到右孩子。
  3. 后序
    按照“中-左-右”进栈,每次弹出节点记录到数组然后左右孩子入栈,最后逆置List。
Collections.reverse(list); // list逆置

二叉树的层序遍历BFS

用队列,每次出队把孩子放进去
102.二叉树的层序遍历
107.二叉树的层序遍历II
199.二叉树的右视图
637.二叉树的层平均值
注意求double的时候,先把sum设置成double
429.N叉树的层序遍历
list的访问:node.children.get(i)
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
让前节点指向当前,设置前节点的next,不要向后指,向后容易忘记处理最后一个
不要直接指向peek,指向peek永远是队列首,出栈节点就丢了
117.填充每个节点的下一个右侧节点指针II
和上面的没啥区别
104.二叉树的最大深度
111.二叉树的最小深度

226.翻转二叉树

用前序后序层序都可以,中序不太行,会重复翻转

101.对称二叉树

可以选择用递归或者迭代
递归三步:返回值和参数;终止条件;单层递归逻辑
迭代可以用双端队列or普通队列
100.相同的树
572.另一棵树的子树

222.完全二叉树的节点个数

判断一棵完全二叉树是否为满二叉树时,对比往左的深度和往右的深度是否相同即可,相同则满。

return (2 << leftDepth) - 1; //2 << leftDepth表示2的leftDepth次方

110.平衡二叉树

不平衡时返回-1,平衡返回高度

257.二叉树的所有路径

可以重做一遍
递归+回溯,递归后马上回溯
终止条件(叶子节点)需要处理paths格式

404.左叶子之和

需要从父节点判断左孩子节点是否为左叶子

513.找树左下角的值

找最左下角用层序,每次记录循环第一个节点的值

路径总和

112.路径总和
需要boolean返回值,如果已经找到了正确路径就可以直接返回不继续了
113.路径总和
不需要返回,因为需要遍历整个树寻找正确的路径
注意list.add(item)和list.add(new ArrayList<>(item))的区别
直接将item加入list的时候,随着item变化,list也会变化

中序和前后序构造二叉树

106.从中序与后序遍历序列构造二叉树
注意分割数组的时候左右开闭,每次传参的数组左右范围,可以重做
105.从前序与中序遍历构造二叉树
一个意思

654.最大二叉树

同上

617.合并二叉树

注意当其中一个树的节点不存在时,直接返回存在的节点(带着孩子)就好,不需要新建节点,如果新建节点,则该节点后续孩子还需要处理

98.验证二叉搜索树

注意二叉搜索树根节点的右孩子的左孩子也必须比根节点大
也就是中序是由小到大排列
需要在中序处理中间节点的时候判断该节点是不是大于前一位
不可以先序判断左右孩子

530.二叉搜索树的最小绝对差值

指针记录中序前一个结点

501.二叉搜索树中的众数

如果是平常的树可以用hashmap记录,二叉搜索树可以用一个list存放目前已知节点的众数,当count比已知MaxCount更大时,清空list加入新众数

236.二叉树的最近公共祖先

寻找祖先需要从叶子往根遍历,即回溯,可以用后序遍历实现回溯的过程。
程序出口是root空或者当前节点为p或q,返回当前节点

  • 先得到左右孩子的返回值,如果二者都null证明没找到,返回null
  • 如果左右一空一非空,则返回非空节点
  • 如果都非空,则当前节点为最近公共祖先

235.二叉搜索树的最近公共祖先

因为是二叉搜索树,所以需要对比当前节点和pq的节点值,如果当前小于pq则在右子树中寻找,如果当前大于pq则从左子树寻找,如果刚好在pq之间,则该节点就是最近公共祖先。

701.二叉搜索树中的插入操作

可以不考虑重构。
如果当前节点为空,可以创建新节点之后返回该节点
如果当前值小于val,则在右子树递归插入函数
如果当前值大于val,则在左子树递归插入函数

450.删除二叉搜索树中的节点

一定注意返回值,返回树的根节点,那么当该节点不是删除的节点时,需要改变左右孩子进行递归然后返回自身。

669.修剪二叉搜索树

处理节点的左孩子时,如果左孩子节点删除,则需要该节点的左孩子定位到原来左孩子的右孩子,可以多做几遍

108.将有序数组转换为二叉搜索树

需要注意取mid时的数组越界问题
所以写成int mid = start + ((end - start)/2);

538.把二叉搜索树转换为累加树

可以利用反中序进行递归,每次累加更改当前节点值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值