二叉树

二叉树

二叉树遍历

前序遍历144. 二叉树的前序遍历

先访问根节点,再前序遍历左子树,再前序遍历右子树

中序遍历94. 二叉树的中序遍历

先中序遍历左子树,再访问根节点,再中序遍历右子树

后序遍历145. 二叉树的后序遍历

先后序遍历左子树,再后序遍历右子树,再访问根节点

注意点

  • 以根访问顺序决定是什么遍历

  • 左子树都比右子树优先遍历

递归遍历

// 递归遍历写法,以前序遍历为例
public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> result = new LinkedList<>();
    traverse(root, result);
    return result;
}

public void traverse(TreeNode p, List<Integer> result) {
    if (p == null) {
        return;
    }
    // 其他遍历调整这里的语句顺序即可
    result.add(p.val);
    traverse(p.left, result);
    traverse(p.right, result);
}

前序非递归

中序非递归

后序非递归

注意点

  • 核心就是:根节点必须在右节点弹出之后,再弹出

DFS 深度搜索

257. 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。

BFS 层次遍历

二叉树分治

先分别处理局部,再合并结果

分治法模板

  • 递归返回条件

  • 分段处理

  • 合并结果

典型示例

98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

注意点:

DFS 深度搜索(从上到下) 和分治法区别:前者一般将最终结果通过参数传入,后者一般递归返回结果最后合并

常见题目

二叉树的最大深度

104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

思路:分治法

平衡二叉树

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

思路:分治法,左边平衡 && 右边平衡 && 左右两边高度 <= 1,因为需要返回是否平衡及高度,要么返回两个数据,要么合并两个数据,所以用-1 表示不平衡,>0 表示树高度(二义性:一个变量有两种含义)。

注意

一般工程中,结果通过两个变量来返回,不建议用一个变量表示两种含义

二叉树中的最大路径和

124. 二叉树中的最大路径和

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

思路:分治法,分为三种情况:左子树最大路径和最大,右子树最大路径和最大,左右子树最大加根节点最大,需要保存两个变量:一个保存子树最大路径和,一个保存左右加根节点和,然后比较这个两个变量选择最大值即可

二叉树的最近公共祖先

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

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

思路:分治法,有左子树的公共祖先或者有右子树的公共祖先,就返回子树的祖先,否则返回根节点

BFS 应用

常见题目

二叉树的层序遍历

102. 二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)

思路:用一个队列记录一层的元素,然后扫描这一层元素添加下一层元素到队列(一个数进去出来一次,所以复杂度 O(logN))

二叉树的层序遍历 II

107. 二叉树的层序遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

思路:在层级遍历的基础上,翻转一下结果即可,在往result内添加元素之前使用Collections.reverse方法翻转列表。

二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历。Z 字形遍历

思路:在层级遍历的基础上,判断这一层是否需要翻转,在往result内添加元素之前加入以下代码:

二叉搜索树应用

常见题目

二叉搜索树中的插入操作

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

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。

思路:找到最后一个叶子节点满足插入条件即可

总结

  • 掌握二叉树递归与非递归遍历

  • 理解 DFS 前序遍历与分治法

  • 理解 BFS 层次遍历

最后更新于