代码随想录算法训练营第17天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
110.平衡二叉树
题目:110.平衡二叉树
文档讲解:代码随想录-110.平衡二叉树
视频讲解:哔哩哔哩-110.平衡二叉树
状态/时间:没写出来/三十分钟
思路:
左右两边向下遍历,如果左右两个绝对值大于就返回-1,如果左边或者右边等于-1,也返回-1.其实递归就是,一层一层向上反馈。同时也要用到三部曲。
代码:
/**
* 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 boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (getHeight(root) == -1) {
return false;
} else {
return true;
}
}
public int getHeight(TreeNode node) {
if (node == null) {
return 0;
}
int leftHeigh = getHeight(node.left);
int rightHeight = getHeight(node.right);
if (leftHeigh == -1) {
return -1;
}
if (rightHeight == -1) {
return -1;
}
int result = 0;
if (Math.abs(leftHeigh - rightHeight) > 1 ) {
result = -1;
} else {
result = 1 + Math.max(leftHeigh, rightHeight);
}
return result;
}
}
注意:
257. 二叉树的所有路径
题目:257. 二叉树的所有路径
文档讲解:代码随想录-257. 二叉树的所有路径
视频讲解:哔哩哔哩-257. 二叉树的所有路径
状态/时间:没写出来/三十分钟
思路:
利用递归和回溯来写,这里也要用前序遍历,主要是好找树的孩子,这题还不是很理解。
代码:
/**
* 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 List<String> binaryTreePaths(TreeNode root) {
// 前序遍历
List<String> res = new ArrayList<String>();
if (root == null) {
return res;
}
List<Integer> paths = new ArrayList<>();// 作为结果中的路径
traversal(root, paths, res);
return res;
}
public void traversal(TreeNode root, List<Integer> paths, List<String> res) {
// 前序遍历 中
paths.add(root.val);
// 终止条件 遇到叶子结点
if (root.left == null && root.right == null) {
// StringBuilder用来拼接元素更快
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));// 记录最后一个节点
// 收集一个路径
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);// 回溯
}
}
}
注意:
404.左叶子之和
题目:404.左叶子之和
文档讲解:代码随想录-404.左叶子之和
视频讲解:哔哩哔哩-404.左叶子之和
状态/时间:没写出来/三十分钟
思路:
需要判断该节点的左节点不为空,以及该节点的左节点的左节点和该节点的左节点的有节点为空,该节点的左节点才左节点,不然没法判断出来是左节点还是右节点。
代码:
/**
* 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 leftNum = sumOfLeftLeaves(root.left);
if (root.left != null && root.left.left == null && root.left.right == null) {
leftNum = root.left.val;
}
// 右
int rightNum = sumOfLeftLeaves(root.right);
// 中
int sum = leftNum + rightNum;
return sum;
}
}
注意: