110. Balanced Binary Tree
题目链接:110.平衡二叉树
思路链接:代码随想录二叉树-平衡二叉树
思路
后续遍历法,中间节点通过子节点返回的高度来计算当前高度,如果左右节点高度差大于1,返回-1,之后的中间节点如果子节点高度出现-1,则中间节点高度也为-1
心路历程
心路历程
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
// 递归法 后续遍历
// height-balanced: 子节点的高度之差小于等于1
// 需要处理的参数:当前节点;返回值:当前节点的最大高度,如果子节点高度之差大于1,返回-1
public int isBalancedHelper(TreeNode curr) {
if (curr == null) {
return 0; // 高度为0
}
// 左
int leftHeight = isBalancedHelper(curr.left);
if (leftHeight == -1) {
return -1;
}
// 右
int rightHeight = isBalancedHelper(curr.right);
if (rightHeight == -1) {
return -1;
}
// 中
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
} else {
return 1 + Math.max(leftHeight, rightHeight);
}
}
public boolean isBalanced(TreeNode root) {
int depth = isBalancedHelper(root);
if (depth == -1) {
return false;
} else {
return true;
}
}
}
257. Binary Tree Paths
题目链接:257.二叉树的所有路径
思路链接:代码随想录二叉树-二叉树的所有路径
思路
利用前序遍历,因为最终结果需要从中间节点开始记录。结束条件与之前不一样,到达叶子节点就结束,因此要在结束条件之前先把当前节点的值add到list里。在递归操作时,验证子节点是否为空,并且进行递归操作后,需要回溯,就是移除记录List的最后一个节点,也就是回退到上个节点,这是为了判断上个节点的另一个分支。
心路历程
心路历程
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
// 递归法 前序遍历
// 需要处理的参数:当前节点curr, 临时List<Integer>, result List<String>
// 返回值:void
public void binaryTreePathsHelper(TreeNode curr, List<Integer> paths, List<String> result) {
// 中
paths.add(curr.val);
// 结束条件
if (curr.left == null && curr.right == null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < paths.size() - 1; i++) {
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size() - 1));
result.add(sb.toString());
}
// 递归操作
// 左
if (curr.left != null) {
binaryTreePathsHelper(curr.left, paths, result);
// 回溯操作 回退到上一节点,看看有没有分叉
paths.remove(paths.size() - 1);
}
// 右
if (curr.right != null) {
binaryTreePathsHelper(curr.right, paths, result);
// 回溯操作 回退到上一节点,看看有没有分叉
paths.remove(paths.size() - 1);
}
}
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new LinkedList<>();
List<Integer> paths = new LinkedList<>();
if (root == null) {
return result;
}
binaryTreePathsHelper(root, paths, result);
return result;
}
}
Problem
题目链接:404. Sum of Left Leaves
思路链接:代码随想录二叉树-左叶子之和
思路
后续遍历,因为需要将左右子节点的左叶子之和相加,才能得到中间节点的左叶子之和。结束条件就是判断是否为叶子的条件,当前节点的左右叶子是否为空。然后是左右子节点的递归操作得到leftSum,rightSum,对于左节点来说,要判断是否左叶子节点,若是,则直接将左叶子节点的值赋给leftSum
心路历程
心路历程
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
return 0;
}
int leftSum = sumOfLeftLeaves(root.left);
if (root.left != null && root.left.left == null && root.left.right == null) {
leftSum = root.left.val;
}
int rightSum = sumOfLeftLeaves(root.right);
int sum = leftSum + rightSum;
return sum;
}
}