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 那么把本次路径弹出 回退到根节点 装下一条路径 回溯说白了其实就是把放入的元素给移除掉取出来

递归三部曲

  1. 递归的参数

根节点 每一条的路径 存放结果的结果集 不需要返回值

  1. 终止条件

当找到叶子节点 也就是cur不等于空 但cur的左右孩子是空的情况下 就找到了叶子节点 找到叶子就是终止条件

  1. 处理逻辑

使用前序便利 先处理根节点 跟节点就是我们要记录路径上的节点 先放入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.左叶子之和

计算给定二叉树的所有左叶子之和。

左叶子是什么:

  1. 首先也是叶子节点
  2. 一定是父节点的左孩子

本题采用后续便利 左右跟 因为需要收集信息返回给根节点处理

如果便利到叶子节点 也就是左右孩子都是空 返回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;

}
posted @ 2024-11-18 15:48  小杭呀  阅读(16)  评论(0)    收藏  举报