代码随想录刷题记录day16 之 平衡二叉树+二叉树的所有路径+左叶子之和
参考:代码随想录
110. 平衡二叉树
思想
二叉树是否平衡的判断条件是左右子树的高度是否相差大于1
递归终止条件值 node==null 向上返回0;
再去计算左子树的高度和右子树的高度
如果左子树已经不是平衡二叉树,就会一直向上返回-1
同样 如果右子树已经不是平衡二叉树,也会一直向上返回-1
再处理中间节点,判断左右子树的高度差,决定向上返回-1还是向上返回 该节点的高度
代码
class Solution {
public boolean isBalanced(TreeNode root) {
//递归法
int flag=balance(root);
if(flag==-1) return false;
return true;
}
public int balance(TreeNode node){
//递归终止条件
if(node==null) return 0;
//求左子树的高度 右子树的高度
int leftHeigth=balance(node.left);
//如果左子树已经不是平衡二叉树了 就一直向上返回-1
if(leftHeigth==-1) return -1;
int rightHeight=balance(node.right);
//如果右子树不是平衡二叉树了, 也一直向上返回-1
if(rightHeight==-1) return -1;
if(Math.abs(leftHeigth-rightHeight)>1){
//不是平衡二叉树
return -1;
}else{
return 1+Math.max(leftHeigth,rightHeight);
}
}
}
257. 二叉树的所有路径
思想
递归 有回溯的过程,用一个path来记录走过的路,当回退到上一个节点是,记录中对应的值也应该被删除。
例:1-2-5 到 递归返回至上一节点时,5要被弹出,再返回,2就要被弹出。
代码
class Solution {
List<String> res=new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
List<String> path=new ArrayList<>();
paths(root,path);
return res;
}
public void paths(TreeNode node,List<String> path){
path.add(String.valueOf(node.val));
if(node.left==null && node.right==null) {//只需要判断叶子节点 这里如果写成node==null 就永远无法进入这个循环
System.out.println(path);
StringBuilder sb=new StringBuilder();
for(int i=0;i<path.size();i++){
if(i!=path.size()-1){
sb.append(path.get(i)+"->");
}
else{
sb.append(path.get(i));
}
}
res.add(new String(sb));
return ;
}
//单层逻辑
if(node.left!=null){
// path.add(String.valueOf(node.val)); //如果把添加节点值得操作写在这里 会少添加最后一个元素 因为我是判断下一个节点,不为空再添加 实际上 当前节点已经不是一个空姐点了,所以得先添加
//回溯 删除刚刚添加的节点
paths(node.left,path);
path.remove(path.size()-1);
}
if(node.right!=null){
// path.add(String.valueOf(node.val));
//回溯 删除刚刚添加的节点
paths(node.right,path);
path.remove(path.size()-1);
}
}
}
404. 左叶子之和
思想
-
递归
需要通过父节点来判断子节点是否是左叶子节点,记录下来这个值
代码
public int sumOfLeftLeaves(TreeNode root) {
//左叶子之和 遍历到叶子节点
return leftLeaves(root);
}
public int leftLeaves(TreeNode node){
//递归终止条件
if(node==null) return 0;//当前节点是空节点 返回0
if(node.left==null&& node.right==null) return 0;
int midValue=0;
if(node.left!=null && node.left.left==null && node.left.right==null){ //需要根据父节点来判断是否是左叶子节点
//找到了左叶子节点 记录下来
midValue=node.left.val;
}
int leftValue=leftLeaves(node.left);
int rightValue=leftLeaves(node.right);
return leftValue+rightValue+midValue;
}
总结
平衡二叉树判断左右子树的高度是否大于1,用一个标记标记位来提前判断左子树和右子树是否已经不是平衡二叉树了,如果已经不是了 就一直向上返回这个标记位。在题解中这个标记位取为1
二叉树的所有路径包含了一个回溯的过程,注意需要把加入路径的那一步放到一开始,因为递归终止条件是叶子节点就向上返回。 把路径加入以后,再去递归左右子节点,回退的过程要把路径中的元素给删除了。
左叶子之和:最重要的是要用父节点去判断是否是左叶子节点。