内容:
- 平衡二叉树(110)
- 二叉树的所有路径(257)
- 左叶子只和(404)
1.平衡二叉树
难度:🔥🔥
建议:再一次涉及到,什么是高度,什么是深度,可以巩固一下。优先掌握递归
1.1 思路分析
当前传入节点为根节点的二叉树已经不是二叉平衡树了,那么我们就返回-1
1.2 代码实现
后序遍历
class Solution {
public boolean isBalanced(TreeNode root) {
return isAVL(root) != - 1;
}
private int isAVL(TreeNode root){
if (root == null) {
return 0;
}
int leftHeight = isAVL(root.left);
if(leftHeight == -1){
return - 1;
}
int rightHeight = isAVL(root.right);
if(rightHeight == - 1){
return -1;
}
if (Math.abs(leftHeight - rightHeight) > 1) {
return - 1;
}
return Math.max(leftHeight,rightHeight) + 1;
}
}
1.3 注意事项
1.4 收获总结
2.二叉树的所有路径
难度:🔥🔥🔥
建议:第一次接触回溯的过程。优先掌握递归
2.1 思路分析
这道题目涉及到一点回溯。我们使用前序遍历,先处理中间节点,当遍历到叶子节点时,我们将路径连接加入result
数组中。
递归完,还要回溯,因为path
不能一直加入节点,它还要删节点,然后才能加入新的节点。
2.2 代码实现
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<Integer> list = new ArrayList<>();
List<String> result = new ArrayList<>();
if (root == null) {
return result;
}
traversal(root,list,result);
return result;
}
private void traversal(TreeNode root,List<Integer> path,List<String> result){
path.add(root.val);
if (root.left == null && root.right == null) {
StringBuilder sb = new StringBuilder();
for(int i = 0;i < path.size() - 1;i++){
sb.append(path.get(i)).append("->");
}
sb.append((path.get(path.size() - 1)));
result.add(sb.toString());
return;
}
if (root.left != null) {
traversal(root.left,path,result);
path.remove(path.size() - 1);
}
if (root.right != null) {
traversal(root.right,path,result);
path.remove(path.size() - 1);
}
}
}
2.3 注意事项
2.4 收获总结
3.左叶子之和
难度:🔥🔥
建议:搞清楚什么是左叶子,剩下的就是二叉树的基本操作了。优先掌握递归
3.1 思路分析
我们需要判断那个节点是左叶子节点。判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
当前节点的左子树不为空并且当前节点的左节点的左孩子和右孩子为空则添加该值。
3.2 代码实现
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
//可写可不写
if (root.left == null && root.right == null) {
return 0;
}
int leftValue = sumOfLeftLeaves(root.left);
int rightValue = sumOfLeftLeaves(root.right);
int minValue = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
minValue += root.left.val;
}
int result = minValue + leftValue + rightValue;
return result;
}
}