目录
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
- class Solution {
- /**
- * 递归法
- */
- public boolean isBalanced(TreeNode root) {
- return getHeight(root) != -1;
- }
-
- private int getHeight(TreeNode root) {
- if (root == null) {
- return 0;
- }
- int leftHeight = getHeight(root.left);
- if (leftHeight == -1) {
- return -1;
- }
- int rightHeight = getHeight(root.right);
- if (rightHeight == -1) {
- return -1;
- }
- // 左右子树高度差大于1,return -1表示已经不是平衡树了
- if (Math.abs(leftHeight - rightHeight) > 1) {
- return -1;
- }
- return Math.max(leftHeight, rightHeight) + 1;
- }
- }
- //解法一
-
- //方式一
- class Solution {
- /**
- * 递归法
- */
- public List
binaryTreePaths(TreeNode root) { - List
res = new ArrayList<>();// 存最终的结果 - if (root == null) {
- return res;
- }
- List
paths = new ArrayList<>();// 作为结果中的路径 - traversal(root, paths, res);
- return res;
- }
-
- private void traversal(TreeNode root, List
paths, List res) { - paths.add(root.val);// 前序遍历,中
- // 遇到叶子结点
- if (root.left == null && root.right == null) {
- // 输出
- StringBuilder sb = new StringBuilder();// StringBuilder用来拼接字符串,速度更快
- for (int i = 0; i < paths.size() - 1; i++) {
- sb.append(paths.get(i)).append("->");
- }
- sb.append(paths.get(paths.size() - 1));// 记录最后一个节点
- res.add(sb.toString());// 收集一个路径
- return;
- }
- // 递归和回溯是同时进行,所以要放在同一个花括号里
- if (root.left != null) { // 左
- traversal(root.left, paths, res);
- paths.remove(paths.size() - 1);// 回溯
- }
- if (root.right != null) { // 右
- traversal(root.right, paths, res);
- paths.remove(paths.size() - 1);// 回溯
- }
- }
- }
- class Solution {
- public int sumOfLeftLeaves(TreeNode root) {
- if (root == null) return 0;
- int leftValue = sumOfLeftLeaves(root.left); // 左
- int rightValue = sumOfLeftLeaves(root.right); // 右
-
- int midValue = 0;
- if (root.left != null && root.left.left == null && root.left.right == null) {
- midValue = root.left.val;
- }
- int sum = midValue + leftValue + rightValue; // 中
- return sum;
- }
- }