代码随想录算法训练营第17天 | 110. 平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和
110. 平衡二叉树
- 左右子树高度差不大于1 就是平衡二叉树
- 递归三部曲 终止条件 node==null 高度为0 return 0
- 向左遍历 求得左边子树的高度 leftheight = getheight(node.left)
- 向右遍历 求得右边子树的高度 rightheight
- 若判断出来左右子树高度相差>1了 返回-1 就一直往上传
- 然后进行中的操作 进行高度计算 若>1 return -1 若小于1 就return res
- 总结 求高度都用 后序遍历 因为要先处理完下面的子节点 才能计算当前高度
class Solution {
public boolean isBalanced(TreeNode root) {
return getheight(root)!=-1;
}
public int getheight(TreeNode node){
if(node == null) return 0;
int leftheight = getheight(node.left);
int rightheight = getheight(node.right);
if(leftheight==-1) return -1;
if(rightheight==-1) return -1;
int res = Math.abs(rightheight-leftheight);
if(res>1){
return -1;
}else{
return Math.max(rightheight,leftheight)+1;
}
}
}
257. 二叉树的所有路径
- 此题从上往下遍历 用前序遍历 首先用中存储节点 然后判断终止条件 若到叶节点就停止遍历 把该条路径加入result
- 然后去遍历左右节点 注意回溯 即 从底往上时 要弹出当前元素
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<Integer> path = new ArrayList<>();
List<String> result = new ArrayList<>();
if(root==null) return result;
return getroute(root,path,result);
}
public List<String> getroute(TreeNode node,List<Integer> path,List<String> result){
path.add(node.val);
if(node.left==null && node.right==null){
StringBuilder sb = new StringBuilder();
for(int i = 0;i<path.size()-1;i++){
sb.append(path.get(i)).append("->");
}
sb.append(path.get(path.size()-1));
result.add(sb.toString());
return result;
}
if(node.left!=null){
getroute(node.left,path,result);
path.remove(path.size()-1);
}
if(node.right!=null){
getroute(node.right,path,result);
path.remove(path.size()-1);
}
return result;
}
}
404. 左叶子之和
- 首先左叶子 的定义 是叶节点 即没有左右子节点的节点 其次 他还得是 其父节点左边的节点
- 判断终结条件的时候 当到空节点 return 0 当到 叶节点 也return 0 因为是后序遍历 叶节点如果是左节点的话 他的值已经被他的父节点统计过了
- 左右遍历时 分别都 统计左右子树 的目前左右子树 左叶节点的和
- 然后中的操作为 判断当下一个左节点为左叶节点时 就取他的值 然后加到 该节点的左右子树 左叶节点和中
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return leftleavesSum(root);
}
public int leftleavesSum(TreeNode node){
if(node==null) return 0;
if(node.left==null && node.right==null) return 0;
int leftsum = leftleavesSum(node.left);
int rightsum = leftleavesSum(node.right);
int midnum = 0;
if(node.left!=null && node.left.left==null && node.left.right==null){
midnum = node.left.val;
}
int sum = midnum + leftsum + rightsum;
return sum;
}
}