1. 平衡二叉树
递归实现 -- 后序遍历
先获取左右子树的高度,再判断高度差
当左右子树高度差大于1,返回-1,说明此二叉树不可能是平衡二叉树了
否则将当前子树的高度返回给父节点
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
public int getHeight(TreeNode root){
if(root == null) return 0;
int leftHight = getHeight(root.left);
if(leftHight == -1)
return -1;
int rightHight = getHeight(root.right);
if(rightHight == -1)
return -1;
if(Math.abs(leftHight - rightHight) > 1)
return -1;
return Math.max(leftHight,rightHight) + 1;
}
}
2. 二叉树的所有路径
递归
先将当前节点的val拼接好
再分别处理它的左右子节点
子节点为空,返回上一层,判断另一个子节点
两个子节点都为空,该路径到头了,将完整路径添加至res,并返回上一层,寻找另一条路径
class Solution {
List<String> res = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
deal(root,"");
return res;
}
public void deal(TreeNode node, String s) {
if(node == null) return;
//到了叶子节点,一条路径收集完毕
if(node.left == null && node.right == null){
res.add(new StringBuilder(s).append(node.val).toString());
return;//返回上一层
}
String str = new StringBuilder(s).append(node.val).append("->").toString();
deal(node.left, str);
deal(node.right, str);
}
}
3. 左叶子之和
父节点的左孩子不为空,且左孩子为叶子节点,即找到其中一个左叶子
所以判断条件是否满足,应该在父节点的位置进行判断
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); // 右
//判断是否存在左叶子
if (root.left != null && root.left.left == null && root.left.right == null) {
leftValue = root.left.val;
}
int sum = leftValue + rightValue; // 中
return sum;
}
}