二叉树的应用
110.平衡二叉树
递归法: 后序遍历求左右子节点的高度 用 -1 标记当前节点是否平衡, 若不平衡则直接向上层返回 -1 若左右子节点高度不等于-1, 则计算高度差是否满足要求,若满足则继续向上返回当前节点高度
class Solution {
// 前序遍历求深度---后序遍历求高度
public boolean isBalanced(TreeNode root) {
return dfs(root) != -1;
}
public int dfs(TreeNode root){
// 用 -1 标记不平衡
if(root == null) return 0;
int left = dfs(root.left);
int right = dfs(root.right);
if(left == -1 || right == -1){
return -1;
}
if(Math.abs(left-right) > 1){
return -1;
}else {
return Math.max(left, right) + 1;
}
}
}
257.二叉树的所有路径
用字符串拼接路径, 回溯遍历, 到叶子节点就记录结果
class Solution {
List<String> list = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
backtracking(root, "");
return list;
}
public void backtracking(TreeNode root, String path) {
if(root.left == null && root.right == null) {
list.add(path + root.val);
return;
}
if(root.left == null){
backtracking(root.right, path + root.val + "->");
}else if(root.right == null) {
backtracking(root.left, path + root.val + "->");
}else {
backtracking(root.left, path + root.val + "->");
backtracking(root.right, path + root.val + "->");
}
}
}
404.左叶子之和
首先肯定是递归遍历处理所有节点 判断是否为左叶子节点:
- 当左节点不为空, 且左节点为叶子节点时, 该节点符合要求, 需要记录其值并向上层返回
- 同时递归左右子节点
- 将所有符合要求的值加起来向上返回和
代码:
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root == null) return 0;
// 找到左叶子节点的值, 从父节点去判断子节点是否为左叶子节点
int mid = 0;
if(root.left != null && root.left.left == null && root.left.right == null){
mid = root.left.val;
}
// 递归处理左右子节点
int left = sumOfLeftLeaves(root.left);
int right = sumOfLeftLeaves(root.right);
return left + right + mid;
}
}