平衡二叉树
这里是要求高度差不超过一
所以用后序遍历递归
三部曲:
1. 如果root == null, 还是return 0
2. 左右中遍历, 但是需要增加返回值条件, 如果子树高度为-1, 说明该子树的左右子树不是平衡二叉树了
3.最后的判断, Math.abs判断左右子树的差是否大于1
4. 最后返回Math.max() + 1
(在solution方法里是boolean, 所以记得是判断!=-1)
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
private int getHeight(TreeNode root){
if(root == null){
return 0;
}
//判断左子树是否平衡
int left = getHeight(root.left);
if(left == -1) return -1;
//判断右子树是否平衡
int right = getHeight(root.right);
if(right == -1) return -1;
//如果左右子树都是平衡的, 那么比较高度差
if(Math.abs(left - right) > 1) return -1;
return Math.max(left, right) + 1;
}
}
二叉树的所有路径
思路: 这里虽然说是用回溯, 但是我的最后解法没有用, 还是前序遍历, 用stringbuilder操作, 细节较多
细节:
1. 需要根节点(TreeNode root), 路径的sb(String path) 和一个结果字符串(List<Integer> res), 所以创建方法时就要注意
2. 注意一开始的if(root != null)是要把代码都包起来的, 然后创建sb, sb要放入path
3.sb.append先把根节点放入路径, 但是由于root是节点,所以用Integer.toString()
4.单节点为叶子节点时, 就说明走完一条路了, 然后就放到res字符串记录
5. 否则进行递归, 记得要append->, 然后方法参数要写对
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> ans = new ArrayList<>();
//定一下, ""说明是空的字符串
dfs(root, "", ans);
return ans;
}
public void dfs(TreeNode root, String path, List<String> ans){
if(root != null){
StringBuilder sb = new StringBuilder(path);
//中, 把root放到sb里记录路径
sb.append(Integer.toString(root.val));
//为叶子节点时, 将路径加入到结果集
if(root.left == null && root.right == null){
ans.add(sb.toString());
} else {
sb.append("->");
dfs(root.left, sb.toString(), ans);
dfs(root.right, sb.toString(), ans);
}
}
}
}
左叶子之和
注意: 一定是左边的叶子节点(孩子为空)之和
递归(后序):
1. 当节点为null时, 和当叶子节点为null时, 直接返回(因为是在父节点的位置判断左右节点和)
2. 判断左孩子不为空 && 左孩子的左孩子//左孩子的右孩子为空, 返回左孩子的数值
3. 遍历右孩子
4. 中就是sum == 左孩子+右孩子
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
//先判断节点和子节点不为null
if(root == null) return 0;
if(root.left == null & root.right == 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);
int sum = left + right;
return sum;
}
}