首页 > 其他分享 >代码随想录训练营第十五天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

代码随想录训练营第十五天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

时间:2024-12-14 19:31:09浏览次数:6  
标签:paths return int root 随想录 二叉树 null 第十五天 left

110.平衡二叉树

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

讲解链接:代码随想录

 求高度不是求深度 高度需要从下到上(后序遍历) 深度需要从上到下(先序遍历)

Java代码:

class Solution {
    public boolean isBalanced(TreeNode root) {
      //递归做法
      return getHeight(root) != -1;
    }
    private int getHeight(TreeNode root){
        if(root == null) return 0;
        int leftHeight = getHeight(root.left);
        if(leftHeight == -1) return -1;
        int rightHeight = getHeight(root.right);
        if(rightHeight == -1) return -1;
        if(Math.abs(leftHeight - rightHeight) > 1){
            return -1;
        }
        return Math.max(leftHeight,rightHeight) + 1;
    }
}

257. 二叉树的所有路径  

题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

讲解链接:代码随想录

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点   回溯和递归都是相伴相生的

递归

  1. 递归函数参数以及返回值
  2. 确定递归终止条件
  3. 确定单层递归逻辑

Java代码: 

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        //递归
        List<String> res = new ArrayList<>();//存最终结果
        if(root == null) return res;
        List<Integer> paths = new ArrayList<>();//作为结果中的路径
        traversal(root, paths, res);
        return res;
    }
    private void traversal(TreeNode root, List<Integer> paths, List<String> res){
        paths.add(root.val);///前序遍历 中间节点
        if(root.left == null && root.right == null){
            //输出
            StringBuilder sb = new StringBuilder();
            //StringBuilder用来拼接字符串 速度更快
            for(int i = 0; i < paths.size() - 1; i++){
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() - 1));//记录最后一个节点
            res.add(sb.toString());//收集一个路径
            return;
        }
        //递归和回溯是同时进行 所以需要放在同一个花括号里
        if(root.left != null){//左
            traversal(root.left, paths, res);
            paths.remove(paths.size() - 1);//回溯
        }
        if(root.right != null){//右
            traversal(root.right, paths, res);
            paths.remove(paths.size() - 1);//回溯
        }
    }
}

 404.左叶子结点之和

题目链接:404. 左叶子之和 - 力扣(LeetCode)

讲解链接:代码随想录

本题要通过节点的父节点判断本节点的属性

给定二叉树的根节点 root ,返回所有左叶子之和。

Java代码:

/迭代法
class Solution{
    public int sumOfLeftLeaves(TreeNode root){
        if(root == null) return 0;
        Stack<TreeNode> stack = new Stack<>();
        stack.add(root);
        int result = 0;
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            if(node.left != null && node.left.left == null && node.left.right == null){
                result += node.left.val;
            }
            if(node.left != null) stack.add(node.left);
            if(node.right != null) stack.add(node.right);
        }
        return result;
    }
}  
//递归法
class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        //递归
        if(root == null) return 0;
        int leftvalue = sumOfLeftLeaves(root.left);//左
        int rightvalue = sumOfLeftLeaves(root.right);//右
        int midvalue = 0;
        if(root.left != null && root.left.left == null && root.left.right == null){
            midvalue = root.left.val;
        }
        int sum = midvalue + leftvalue + rightvalue;
        return sum;
    }
}

 222.完全二叉树的节点个数

题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

讲解链接:代码随想录

一样的 迭代递归写法

Java代码:

class Solution{
    //前序遍历迭代法
    public int countNodes(TreeNode root){
        if(root == null) return 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        int count = 0;
        while(!q.isEmpty()){
            for(int i = 0; i < q.size(); i++){
                TreeNode node = q.poll();
                count++;
                if(node.left != null) q.offer(node.left);
                if(node.right != null) q.offer(node.right);
            }
        }
        return count;
    }
}
//递归
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

OK今天完成的比较早去看看八股 

 

 

标签:paths,return,int,root,随想录,二叉树,null,第十五天,left
From: https://blog.csdn.net/chengooooooo/article/details/144401063

相关文章

  • 代码随想录训练营第十八天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.
     530.二叉搜索树的最小绝对差 题目链接/文章讲解:代码随想录视频讲解:二叉搜索树中,需要掌握如何双指针遍历!|LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili 注意是二叉搜索树,二叉搜索树可是有序的。给你一个二叉搜索树的根节点 root ,返回 树中任意两......
  • 科丁乐K12137 二叉树中的秘密
    题目描述新年伊始,我飞买了一棵二叉树,传闻这棵二叉树的某一个节点上隐藏着上古的秘密,于是我飞开始昼夜不息的寻找。本着不遗漏任何一个节点的原则,飞神打算遍历整棵二叉树。设S为飞神当前所处的节点。若S有两个子节点L,R,则飞神总是先去遍历节点较少的那棵子树,然后再去遍历另......
  • 开拓计划4 - 二叉树与并查集
    开拓计划4-二叉树与并查集二叉树二叉树的概念Q:什么是树?A:一种有\(n\)个节点最多有\(n-1\)条边的图。Q:什么是二叉树?A:每个节点都最多只有两个子节点的树。二叉树和递归Q:二叉树和递归有什么关系?A:在执行递归的时候总是会自己调用自己,每一次调用都会产生新的一层,新......
  • 代码随想录算法训练营第四十六天|LeetCode647.回文串、LeetCode516.最长回文子序列
    前言打卡代码随想录算法训练营第49期第四十六天 ε(*′・∀・`)з゙首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode647......
  • 代码随想录算法训练营第四十五天|LeetCode115.不同的子序列、LeetCode583.两个字符串
    前言打卡代码随想录算法训练营第49期第四十五天ε(*′・∀・`)з゙首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode115不......
  • 代码随想录训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 9
    654.最大二叉树  题目链接/文章讲解:代码随想录视频讲解:又是构造二叉树,又有很多坑!|LeetCode:654.最大二叉树_哔哩哔哩_bilibili创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组......
  • 代码随想录训练营第十六天| 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历
    513.找树左下角的值 题目链接:513.找树左下角的值-力扣(LeetCode)讲解链接:代码随想录 求最后一行最后一个左子节点的值就是求二叉树深度最大的叶子节点递归:确定递归函数的参数和返回值参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。这里......
  • 每日一刷——二叉树的构建——12.12
    第一题:最大二叉树题目描述:654.最大二叉树-力扣(LeetCode)我的想法:我感觉这个题目最开始大家都能想到的暴力做法就是遍历找到数组中的最大值,然后再遍历一遍,把在它左边的依次找到最大值,但是emmm,感觉效率很低,时间上肯定过不了然后其实我会觉得这个题目跟大根堆和小根堆有......
  • 数字组合转字母&删除二叉树节点&字符串相乘&打家劫舍ii&无序数组第k大 &无序数组前k大
    一、数字串转换为字符串1-26个数字分别代表26个字符(A-z)输入"12326〞就可以拆分为【1,2,3,2,6】、(12,3,2,6].[1,23,2,6]【1,23,26】、【12,3,26】等,将每种组合转成成对应字母输出,输出所有可能的结果返回所有可能的转换结果//将数字串转换成字母串//将数字串转换成字母......
  • 每日一刷——二叉树——12.09
    第一题:二叉树的层序遍历题目描述:102.二叉树的层序遍历-力扣(LeetCode)我的思路:拿到这个题目,我首先想到的是利用队列来模拟,给我二叉树的根节点,然后我来返回每一层的各个节点,但是为啥我甚至觉得这个题目给的输入就是按照层序遍历来给的呢??然后感觉还有一个点就是咋返回成几......