这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
剑指 Offer 55 - I. 二叉树的深度
题目
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
提示:
节点总数 <= 10000
方法一
DFS:维护一个全局变量res,若当前遍历到的深度大于res时,将res更新为当前深度;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
return dfs(root);
}
int dfs(TreeNode root) {
if (root == null) return 0;
return Math.max(dfs(root.left), dfs(root.right)) + 1;
}
}
方法二
BFS:层序遍历
每次遍历二叉树的一层结点,求得总共遍历了几层,即为深度;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
LinkedList<TreeNode> q, t;
q = new LinkedList<>();
if (root != null) q.add(root);
int res = 0;
while(q.size() > 0) {
t = new LinkedList<>();
for (TreeNode node : q) {
if (node.left != null) t.add(node.left);
if (node.right != null) t.add(node.right);
}
res ++;
q = t;
}
return res;
}
}
剑指 Offer 55 - II. 平衡二叉树
题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。
限制:
0 <= 树的结点个数 <= 10000
方法一
DFS:判断每个节点的左右子树高度之差,并更新res,若res最后大于1,则false;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res = 0;
public boolean isBalanced(TreeNode root) {
dfs(root);
return res <= 1;
}
int dfs(TreeNode root) {
if (root == null) return 0;
int left = dfs(root.left);
int right = dfs(root.right);
res = Math.max(res, Math.abs(left - right));
return Math.max(left, right) + 1;
}
}