二叉树的遍历DFS
144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历
递归
前中后序分别按顺序调用函数就好,左右孩子递归
迭代(非递归)
用栈
- 前序
按照“中-右-左”进栈,每次弹出节点记录到数组然后右左孩子入栈。 - 中序
比较复杂可以重做
循环条件是栈不空或者当前节点不空,如果当前节点不空,入栈并移动指针到左孩子;如果当前节点为空,出栈,指针移动到出栈节点,记入数组,指针移动到右孩子。 - 后序
按照“中-左-右”进栈,每次弹出节点记录到数组然后左右孩子入栈,最后逆置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.把二叉搜索树转换为累加树
可以利用反中序进行递归,每次累加更改当前节点值