day15 - lc110平衡二叉树 || lc257二叉树所有路径 || lc404左叶子之和 || lc222完全二叉树的节点个数
day15
Lc110. 平衡二叉树
给定一个二叉树,判断它是否为平衡二叉树
平衡二叉树就是 任何一个节点 他的左右子树的高度相差不超过一 小于等于一
求高度 一定要使用后续便利 左--- 右---- 跟
public boolean isBalanced(Node root){
return getH(root) != -1;
}
public int getH(Node root){
if(root == null) return 0;
int lH = getH(root.l);
if(lH == -1) return -1;
int rH = getH(root.r);
if(rH == -1) return -1;
if(Math.abs(lH - rH) > 1) return -1;
return Math.max(lH, rH) + 1;
}
Lc257. 二叉树的所有路径
给你一个二叉树的根节点
<font style="color:rgba(38, 38, 38, 0.75);background-color:rgb(240, 240, 240);">root</font>,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
求路径 使用前序便利 跟--- 左--- 右 因为只有前序 才能让父节点指向他的孩子
本题还会涉及到回溯 比如一个路径是 1 3 5 那么把本次路径弹出 回退到根节点 装下一条路径 回溯说白了其实就是把放入的元素给移除掉取出来
递归三部曲
- 递归的参数
根节点 每一条的路径 存放结果的结果集 不需要返回值
- 终止条件
当找到叶子节点 也就是cur不等于空 但cur的左右孩子是空的情况下 就找到了叶子节点 找到叶子就是终止条件
- 处理逻辑
使用前序便利 先处理根节点 跟节点就是我们要记录路径上的节点 先放入path路径里面
开始递归以及回溯 回溯是和递归异一一对应 有一个递归就有一个回溯 所以回溯应该放在递归的下一行 但在同级括号内
public List<String> binaryTreePaths(Node root) {
List<String> res = new ArrayList<>(); //结果
List<Integer> path = new ArrayList<>(); //路径
if(root == null) return res;
getPath(root, path, res);
return res;
}
public static void getPath(Node root, List<Integer> path, List<String> res) {
//跟
path.add(root.v);
if(root.l == null && root.r == 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));
res.add(sb.toString());
return;
}
//左
if(root.l != null){
getPath(root.l, path, res);
path.remove(path.size() - 1); //回溯
}
//右
if(root.r != null){
getPath(root.r, path, res);
path.remove(path.size() - 1);
}
}
lc404.左叶子之和
计算给定二叉树的所有左叶子之和。

左叶子是什么:
- 首先也是叶子节点
- 一定是父节点的左孩子
本题采用后续便利 左右跟 因为需要收集信息返回给根节点处理
如果便利到叶子节点 也就是左右孩子都是空 返回0 因为左子树 没有左叶子之和 右子树也没有右和
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
public int sumOfLeftLeaves(Node root) {
if(root == null) return 0;
// 左 右 跟
int lV = sumOfLeftLeaves(root.l);
int rV = sumOfLeftLeaves(root.r);
int mid = 0;
if(root.l != null && root.l.l == null && root.l.r == null) mid = root.l.v;
return mid + lV + rV;
}
lc222. 完全二叉树的节点个数
给出一个完全二叉树,求出该树的节点个数。
什么是完全二叉树呢?
除了底层节点 上面的节点全部是满的 底层节点是左到右 ** 左节点必须存在 否则不是完全二叉树**
public int countNodes(Node root){
if(root == null) return 0;
return countNodes(root.l) + countNodes(root.r) + 1;
}

浙公网安备 33010602011771号