KOKO-代码随想录算法训练营Day17 | 110| 257| 404
文章目录
一、110.平衡二叉树
1.题目
2.代码
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
int len=getHeight(root);
return len==-1?false:true;
}
private int getHeight(TreeNode root) {
if(root==null){
return 0;
}
int left=getHeight(root.left);
if(left==-1){
return -1;
}
int right=getHeight(root.right);
if(right==-1){
return -1;
}
int res;
if(Math.abs(left-right)>1){
res=-1;
}else {
res=1+Math.max(left,right);//取高度
}
return res;
}
3.总结
后序遍历就是从叶子节点开始,计算高度,left=getHeight();就是第一个最左侧的叶子节点的值已记录,回到了该叶子节点处,然后取右叶子节点的子节点,收获值后再在左侧第一个叶子节点处比较取得最大值后向上传递。
节点处收获比较值。
二、257. 二叉树的所有路径
1.题目
2.代码
public List<String> binaryTreePaths(TreeNode root) {
List<String> res= new ArrayList<>();
List<Integer> list=new ArrayList<>();
getPath(root,res,list);
return res;
}
private void getPath(TreeNode root, List<String> res, List<Integer> sb) {
sb.add(root.val);
if(root.left==null&&root.right==null){
//收集节点
String temp="";
for (int i = 0; i <sb.size()-1 ; i++) {
temp=temp+sb.get(i)+"->";
}
temp+=sb.get(sb.size()-1);
res.add(temp);
return;
}
if(root.left!=null){
getPath(root.left,res,sb);
sb.remove(sb.size()-1);
}
if(root.right!=null){
getPath(root.right,res,sb);
sb.remove(sb.size()-1);
}
}
3.总结
回溯就是在递归后做的操作,是终止条件满足后的下一步操作,即终止节点的上一个节点。
叶子节点判断方法:
root!null&&root.leftnull&&root.right==null;
三. 404.左叶子之和
1.题目:
2.代码:
public static int sumOfLeftLeaves(TreeNode root) {
return getLeftSum(root);
}
private static int getLeftSum(TreeNode root) {
if(root==null){
return 0;
}
if(root.left==null&&root.right==null){
return 0; //叶子节点获取下面的值为0,
}
int left=getLeftSum(root.left);//是左叶子节点了,0到叶子节点
if(root.left!=null&&root.left.left==null&&root.left.right==null){
left=root.left.val;
}
int right=getLeftSum(root.right);
return left+right;
}
3.总结:
要判断一个节点是不是左叶子节点,需要根据父节点去判断,即root.left!=null&&root.left.leftnull&&root.left.rightnull;
右子树只需把节点传入即可。左子树也只需把节点传入即可,即在父节点处收集。