语言
Java
226.翻转二叉树
题目
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
思路
本次采取递归的方式,迭代法后续更新。
采用后序遍历的方式遍历二叉树,左右中,先第二层交换,再交换第三层的子树。
具体细节看代码。
代码
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {//判断节点不为空也是遍历的终止条件
return null;
}
invertTree(root.left);//左右中
invertTree(root.right);
swapChildren(root);
return root;
}
public void swapChildren(TreeNode root) {//交换子树节点的一个方法
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
易错点
在写交换方法的时候我最开始把参数写成了root.left和root.right。后知后觉发现传入根节点会好一些。
记得遍历方法是后序遍历。
101. 对称二叉树
题目
给你一个二叉树的根节点 root
, 检查它是否轴对称。
思路
采用递归,左右中遍历,对比左右节点是否相等。
需要判断的条件有:左右节点是否为空、左右节点都为空,左右节点的值是否相等。
代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);//返回结果布尔值
}
private boolean compare(TreeNode left, TreeNode right) {
if (left != null && right == null) {//判断左右为空的情况
return false;
}
if (left == null && right != null) {
return false;
}
if (left == null && right == null) {//判断双方都为空的情况
return true;
}
if (left.val != right.val) {//值不相等的情况
return false;
}
boolean compareOutside = compare(left.left, right.right);//比较外侧
boolean compareInside = compare(left.right, right.left);//比较内侧
return compareInside && compareOutside;
}
}
易错点
注意看看判断的条件,是双方为空还是单个节点为空。
104.二叉树的最大深度
题目
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
思路
本题依然采取递归的方式来做,最大深度就是根节点到达最远子节点的距离。
采用后序遍历
先判断节点是否为空然后左右中,解决。
代码
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int leftLen = maxDepth(root.left);
int rightLen = maxDepth(root.right);
return Math.max(leftLen, rightLen) + 1;
}
}
易错点
记得判断节点是否为空,且返回的是0;
最后返回结果的时候要+1。
111.二叉树的最小深度
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
思路
本题依然采用递归法,先判断节点是否为空,左右中后序遍历。具体细节看代码。
代码
class Solution {
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDep = minDepth(root.left);
int rightDep = minDepth(root.right);
if (root.left == null) {
return rightDep + 1;
}
if (root.right == null) {//右边为空向左遍历所以左边深度加一
return leftDep + 1;
}
return Math.min(leftDep, rightDep) + 1;//返回时别忘了加一
}
}
易错点
别忘了判断叶子左右节点是否为空,也要遍历的,因为是最小深度。这是个坑。
总结
这次用递归法解决了这四道题,下次我会用迭代法解决,敬请期待。