110.平衡二叉树
参考文章:代码随想录
参考视频:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili
解题思路:
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
因此只需要计算节点的左右高度差是否大于1即可,采用后序遍历。
public boolean isBalanced(TreeNode root) {
if(countHeight(root)!=-1) return true;
return false;
}
public int countHeight(TreeNode node) {
if (node == null) return 0;
int left = countHeight(node.left);
if (left == -1) return -1;
int right = countHeight(node.right);
if (right == -1) return -1;
if (Math.abs(left - right) > 1) {
return -1;
}
return 1 + Math.max(left, right);
}
257. 二叉树的所有路径
参考文章:代码随想录
参考视频:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径_哔哩哔哩_bilibili
解题思路:
这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。
在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。
前序遍历以及回溯的过程如图:
每当遍历到一个节点时,需要将该节点添加到该路径数组中,如果该节点的左右节点都为空时,证明此节点即为叶子节点,此时需要将路径数组格式处理好后添加到结果数组中。
如果该节点的左节点不为空时,将该左节点连同路径数组作为参数继续递归下去,处理完后记得将路径数组的最后一个数移除,即回溯操作。右节点不为空时操作也是同理。
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
record(root, list, result);
return result;
}
public void record(TreeNode node, List<Integer> list, List<String> result) {
list.add(node.val);
if (node.left == null && node.right == null) {
String str = "";
for (Integer i : list) {
str += i + "->";
}
result.add(str.substring(0, str.length() - 2));
return;
}
if (node.left != null) {
record(node.left, list, result);
list.remove(list.size() - 1);
}
if (node.right != null) {
record(node.right, list, result);
list.remove(list.size() - 1);
}
}
404.左叶子之和
参考文章:代码随想录
参考视频:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和_哔哩哔哩_bilibili
解题思路:
需要理解题意的左叶子是什么意思,其实就是一个节点的左节点为叶子节点的时候,此时需要将其节点值返回到上层。
因为是从下往上传递数值,因此最好采用后序遍历,同时要注意遍历到叶子节点的时候是不能记录该值的,因为我们不清楚该节点是否是左叶子,我们需要进行记录的是一个节点的左节点不为空,与此同时此节点的左右节点同为空的情况,将该左节点的值返回到上一层。
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
if (root.right == null && root.left == null) return 0;
int left = sumOfLeftLeaves(root.left);
if (root.left != null && root.left.left == null && root.left.right == null) {
left = root.left.val;
}
int right = sumOfLeftLeaves(root.right);
return left + right;
}