题目链接: ● 110.平衡二叉树
题目链接/文章讲解/视频讲解:代码随想录
看完代码随想录之后的想法:
我们需要求出每个节点的高度,然后我们需要判断左右节点的高度;
我们需要使用后序遍历来求高度;
如果左右节点返回的是-1 ,说明已经不是平衡了,那我们只需要向上返回-1;
如果两者abs 高度差>1,说明也不平衡;也需要返回 -1;
如果<1,可以求得该节点的高度为max(左子树高度,右子树高度)+ 1;
class Solution {
int getHeigt(TreeNode root) {
if(root == null)
return 0;
int leftGetHeight = getHeigt(root.left);
if(leftGetHeight == -1) return -1;
int rightGetHeight = getHeigt(root.right);
if(rightGetHeight == -1) return -1;
if(Math.abs(rightGetHeight - leftGetHeight) > 1)
return -1;
return Math.max(rightGetHeight , leftGetHeight) + 1;
}
public boolean isBalanced(TreeNode root) {
if(getHeigt(root) == -1)
return false;
return true;
}
}
题目链接:257. 二叉树的所有路径
题目链接/文章讲解/视频讲解:代码随想录
看完代码随想录之后的想法:
使用前序遍历,
如果节点的左节点右节点都为 null那么我们可以终止;
单层循环逻辑{
先把节点放入path里
然后遍历左子树{有回溯}
然后遍历右子树{有回溯}
}
class Solution {
LinkedList<Integer> path = new LinkedList<>();
List<String> result = new LinkedList<>();
void backTracking(TreeNode root) {
path.add(root.val);
if(root.left == null && root.right == null) {
StringBuilder str = new StringBuilder();
for(int i = 0; i < path.size() - 1; i++) {
str.append(path.get(i)).append("->");
}
str.append(path.get(path.size() - 1));
result.add(str.toString());
return ;
}
if(root.left != null) {
backTracking(root.left);
path.pollLast();
}
if(root.right != null) {
backTracking(root.right);
path.pollLast();
}
}
public List<String> binaryTreePaths(TreeNode root) {
backTracking(root);
return result;
}
}
题目链接:404.左叶子之和
题目链接/文章讲解/视频讲解:代码随想录
看完代码随想录之后的想法:
我们用后序遍历;
我们先求出左子树左叶子的和;
再求出右子树左叶子的和;
然后把和加上返回给中节点;
我们需要先判断是否是叶子节点,但是我们无法通过叶子节点判断是否是左叶子节点;
我们在左递归的时候,我们会一直递归到叶子节点,这个时候我们会返回0;因为叶子节点的左子树左叶子之和加上右子树左叶子之和为0;
因为我们执行到了叶子节点,我们就可以判断是否是左叶子,如果是的话
把左子树左叶子和有0 赋值为左叶子的值;
然后递归右子树;
class Solution {
int getLeftSum(TreeNode root) {
if(root == null)
return 0;
if(root.left == null && root.right == null)
return 0;
int leftgetLeftSum = getLeftSum(root.left);
if(root.left != null && root.left.left == null && root.left.right == null)
leftgetLeftSum = root.left.val;
int rightgetLeftSum = getLeftSum(root.right);
return leftgetLeftSum + rightgetLeftSum;
}
public int sumOfLeftLeaves(TreeNode root) {
return getLeftSum(root);
}
}
自己实现过程中遇到哪些困难 :
最后一个题,挺不好想的,我们如何处理左叶子,因为左叶子是在递归结束的时候哦,因此,我们可以放到左递归后面,进行处理;然后再处理右递归;
我们在递归过程中,
if(root.left != null && root.left.left == null && root.left.right == null)
leftgetLeftSum = root.left.val;
这一步只会在递归结束的时候执行,因此在整个其余大递归过程中不会执行
class Solution {
int getLeftSum(TreeNode root) {
if(root == null)
return 0;
if(root.left == null && root.right == null)
return 0;
int leftgetLeftSum = getLeftSum(root.left);
if(root.left != null && root.left.left == null && root.left.right == null)
leftgetLeftSum = root.left.val;
int rightgetLeftSum = getLeftSum(root.right);
return leftgetLeftSum + rightgetLeftSum;
}
public int sumOfLeftLeaves(TreeNode root) {
return getLeftSum(root);
}
}