本文仅用于记录个人学习算法的一个过程,欢迎指教。
树做为培养算法框架思想的基础,我觉得很有必要从树的算法开始学习。
下面,请跟着我在leetCode一起把树研究吃透,请务必跟我一起练习coding,你可以先去leetCode上去自己试着写代码,一定不要先看答案,需要自己有一个思想的过程,如果没有这个过程,根本做不到彻底把握。
首先,你得要了解,在树结构中的基本框架无非就是三种遍历
void traverse(TreeNode root){
// 前序遍历 todo
traverse(root.left);
// 中序遍历 todo
traverse(root.right);
// 后序遍历 todo
}
1、前序遍历:先遍历根节点,再遍历左节点,最后遍历右节点;FBADCEGIH
2、中序遍历:先遍历左节点,再遍历根节点,最后遍历右节点;ABCDEFGHI
这里中序遍历可以有个小办法,你想象把这个树压平,得出来的顺序即中序遍历的顺序。
3、后序遍历:先遍历左节点,再遍历右节点,最后遍历根节点;ACEDBHIGF
例: LeetCode #94:
树的中序遍历
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
traversal(result, root);
return result;
}
void traversal(List<Integer> result, TreeNode root){
if(root == null){return;}
traversal(result, root.left);
result.add(root.val);
traversal(result, root.right);
}
}
例: LeetCode #104:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7], 3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
class Solution {
public int maxDepth(TreeNode root) {
// 根节点判断
if(root == null){
return 0;
}
// 左侧子节点深度
int leftDepth = maxDepth(root.left);
// 右侧子节点深度
int rightDepth = maxDepth(root.right);
// 计算当前最大深度
return Math.max(leftDepth, rightDepth) + 1;
}
}
例: LeetCode #104: