学习任务:
Leetcode226.翻转二叉树
难度:简单
| 相关标签:树、深度优先搜索、广度优先搜索、二叉树
-
题目: 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
-
思路: 遍历的同时做反转操作,靠指针来遍历
-
注意:
-
代码:
深度优先遍历中的前序遍历,递归法
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
swapChildren(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
//交换左右子树
private void swapChildren(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
- 反思:
Leetcode101. 对称二叉树
难度:简单
| 相关标签:树、深度优先搜索、广度优先搜索、二叉树
-
题目: 给你一个二叉树的根节点 root , 检查它是否轴对称。
-
思路: 左子树和右子树可以相互反转,就是对称二叉树
-
注意:
- 只能使用后序遍历,收集孩子的信息需要向上反馈
- 需要借助画图来思考左右子树的比较
-
代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return compare(root.left,root.right);
}
// 比较左右子树是否可以相互反转
public boolean compare(TreeNode left, TreeNode right){
if (left == null && right != null){
return false;
} else if(left != null && right == null){
return false;
} else if (left == null && right == null){
return true;
} else if (left.val != right.val){
return false;
}
// 比较外侧
boolean compareOutside = compare(left.left, right.right);
// 比较内侧
boolean compareInside = compare(left.right, right.left);
boolean isSame = compareOutside && compareInside;
return isSame;
}
}
- 反思:
Leetcode104.二叉树的最大深度
难度:简单
| 相关标签:树、深度优先搜索、广度优先搜索、二叉树
-
题目: 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
-
思路: 根节点的高度,就是二叉树的最大深度,所以本题可以用前序遍历也可以用后序遍历
-
注意:
- 什么是深度?从根节点到最远叶子节点的最长路径上的节点数
- 什么是高度?二叉树中任意一个结点到叶子节点的距离
- 求深度用前序遍历,求高度用后序遍历
-
代码:
先求高度,间接求最大深度,这里使用的是后序遍历
class Solution {
public int maxDepth(TreeNode root) {
// 根节点的高度,就是二叉树的最大深度
return height(root);
}
// 求二叉树的高度
public int height(TreeNode node){
if(node == null){
return 0;
}
int leftheight = height(node.left);
int rightheight = height(node.right);
int h = 1 + Math.max(leftheight, rightheight);
return h;
}
}
- 反思:
Leetcode111.二叉树的最小深度
难度:简单
| 相关标签:树、深度优先搜索、广度优先搜索、二叉树
-
题目: 给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。 -
思路: 如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。
-
注意:
-
代码:
class Solution {
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = minDepth(root.left);
int rightDepth = minDepth(root.right);
int h = Math.min(leftDepth, rightDepth) + 1;
if (root.left == null) {
return rightDepth + 1;
}
if (root.right == null) {
return leftDepth + 1;
}
// 左右结点都不为null
return h;
}
}
- 反思: