二叉树
二叉树遍历
前中后序遍历
前序遍历:144. 二叉树的前序遍历
先访问根节点,再前序遍历左子树,再前序遍历右子树
中序遍历:094. 二叉树的中序遍历
先中序遍历左子树,再访问根节点,再中序遍历右子树
后序遍历:145. 二叉树的后序遍历
先后序遍历左子树,再后序遍历右子树,再访问根节点
注意点
以根访问顺序决定是什么遍历
左子树都是优先右子树
前序递归
// 递归遍历写法,以前序遍历为例
public IList<int?> PreorderTraversalRecursion(TreeNode root)
{
List<int?> result = new List<int?>();
Traverse(root, result);
return result;
}
void Traverse(TreeNode? p, ICollection<int?> result)
{
if (p?.val == null)
{
return;
}
// 其他遍历调整这里的语句顺序即可
result.Add(p.val);
Traverse(p.left, result);
Traverse(p.right, result);
}前序非递归
中序非递归
设置一个栈S存放所经过的根结点(指针)信息;初始化S;
第一次访问到根结点并不访问,而是入栈;
中序遍历它的左子树,左子树遍历结束后,第二次遇到根结点,就将根结点(指针)退栈,并且访问根结点;然后中序遍历它的右子树。
当需要退栈时,如果栈为空则结束。
后序非递归
DFS 和 BFS
DFS 深度优先搜索-从上到下
DFS 深度优先搜索-从下向上(分治法)
注意点:
DFS 深度优先搜索(从上到下) 和分治法区别:前者一般将最终结果通过指针参数传入,后者一般递归返回结果最后合并
BFS 广度优先搜索
常见题目
给你一个二叉树的根节点
root,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
二叉树分治
先分别处理局部,再合并结果
适用场景
快速排序
归并排序
二叉树相关问题
分治法模板
递归返回条件
分段处理
合并结果
伪代码如下
典型示例
给你一个二叉树的根节点
root,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
常见题目
二叉树的的最大深度
给定一个二叉树
root,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
DFS递归解法
BFS队列解法
平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
二叉树中的最大路径和
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点
root,返回其 最大路径和 。
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
思路:分治法,有左子树的公共祖先或者有右子树的公共祖先,就返回子树的祖先,否则返回根节点
BFS 应用
常见题目
二叉树的层序遍历
给你二叉树的根节点
root,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
思路:用一个队列记录一层的元素,然后扫描这一层元素添加下一层元素到队列(一个数进去出来一次,所以复杂度 O(logN))
二叉树的层序遍历II
给你二叉树的根节点
root,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
思路:在层级遍历的基础上,翻转一下结果即可
二叉树的锯齿形层序遍历
给你二叉树的根节点
root,返回其节点值的 锯齿形层序遍历 。锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
二叉搜索树应用
常见题目
二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点
root和要插入树中的值value,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
思路:找到最后一个叶子节点满足插入条件即可
删除二叉搜索树中节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
总结
掌握二叉树递归与非递归遍历
理解 DFS 前序遍历与分治法
理解 BFS 层次遍历
练习
最后更新于