首页 > 编程语言 >代码随想录算法训练营第十三天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和 、222.完全二叉树的节点个数

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

时间:2024-10-30 21:52:29浏览次数:3  
标签:TreeNode val 随想录 二叉树 left root LeetCode 第十三天

110.平衡二叉树

题目链接:. - 力扣(LeetCode)

文章链接:代码随想录

视频链接:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com, 这里刷题顺序,详细题解,应有尽有!, 视频播放量 52807、弹幕量 479、点赞数 1193、投硬币枚数 926、收藏人数 229、转发人数 52, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵),【数据结构】递归判断二叉树是否是平衡二叉树,平衡二叉树:AVL树【代码讲解】,数据结构-二叉树-判断二叉树是否为平衡二叉树,别再记LL,LR,RR,RL各种类型了,一招拿下平衡二叉树!,「六分钟速通」平衡二叉树(AVL树)的插入与删除,贪心算法理论基础!,数据结构——超级简单五分钟搞定平衡二叉树的调整,每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历!| LeetCode:144.前序遍历,145.后序遍历,94.中序遍历,一秒学会 平衡二叉树的调整,非标题党!不简单你打我! (考研数据结构)icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1Ug411S7my

思路:后序先求左右子树高度,再比较高度差,超过1就不是平衡二叉树。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if (getHight(root)==-1){
            return false;
        }
        return true;
    }

    public int getHight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int lhight = getHight(root.left);
        int rhight = getHight(root.right);
        if (lhight == -1 || rhight == -1) {
            return -1;
        }
        if (Math.abs(lhight - rhight) > 1) {
            return -1;
        }
        return Math.max(lhight, rhight) + 1;

    }
}

257. 二叉树的所有路径

题目链接:. - 力扣(LeetCode)

文章链接:代码随想录

视频链接:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com, 这里刷题顺序,详细题解,应有尽有!, 视频播放量 57560、弹幕量 541、点赞数 1280、投硬币枚数 951、收藏人数 237、转发人数 68, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:花了 0.5 个小时,我用 Lua 实现 HeLang,我更完了,你看完了吗?,帮你把KMP算法学个通透!(理论篇),关于二叉树,你该了解这些!| 二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序,写出二叉树的非递归遍历很难么?这次让你不再害怕非递归!|二叉树的非递归遍历 | 二叉树的遍历迭代法 | 前序与中序,一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵),带你学透回溯算法(理论篇)| 回溯法精讲!,带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!,调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点,从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1ZG411G7Dh

思路:前序遍历加回溯。终止条件为到达叶子节点,然后收集路径。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        ArrayList<Integer> path = new ArrayList<>();
        ArrayList<String> result = new ArrayList<>();
        getPath(root,path,result);
        return result;
    }
    public void getPath(TreeNode root, ArrayList<Integer> path, ArrayList<String> result) {
        path.add(root.val);
        if (root.left == null && root.right == null) {
            //StringJoiner stringJoiner = new StringJoiner("->");
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < path.size(); i++) {
                if (i == path.size() - 1) {
                    stringBuilder.append(path.get(i));
                    break;
                }
                stringBuilder.append(path.get(i)).append("->");
            }
            result.add(stringBuilder.toString());
            return;
        }
        if (root.left != null) {
            getPath(root.left, path, result);
            path.remove(path.size() - 1);
        }
        if (root.right != null) {
            getPath(root.right, path, result);
            path.remove(path.size() - 1);
        }
    }
}

404.左叶子之和 

题目链接:. - 力扣(LeetCode)

文章链接:代码随想录

视频链接:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」网站:programmercarl.com, 这里刷题顺序,详细题解,应有尽有!, 视频播放量 39565、弹幕量 346、点赞数 779、投硬币枚数 507、收藏人数 91、转发人数 37, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:贪心算法理论基础!,这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后,动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列,还得用回溯算法!| LeetCode:17.电话号码的字母组合,回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II,你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树,单调队列正式登场!| LeetCode:239. 滑动窗口最大值,动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III,关于二叉树,你该了解这些!| 二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序,后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1GY4y1K7z8

思路:是否为左叶子节点要又其父节点判断。后序先求左子树和右子树的左叶子之和,再相加。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   public int sumOfLeftLeaves(TreeNode root) {
        return getSumOfLeftLeaves(root);
    }

    public int getSumOfLeftLeaves(TreeNode root) {
        if (root == null) {
            return 0;
        }
        if (root.left == null && root.right == null) {
            return 0;
        }
        int lsum = getSumOfLeftLeaves(root.left);
        if (root.left != null && root.left.left == null && root.left.right == null) {
            lsum = root.left.val;
        }
        int rsum = getSumOfLeftLeaves(root.right);

        return lsum + rsum;

    }
}

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

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com, 这里刷题顺序,详细题解,应有尽有!, 视频播放量 46981、弹幕量 469、点赞数 1031、投硬币枚数 747、收藏人数 160、转发人数 47, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:二叉树及其基本运算,带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!,讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历,递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径,二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度,数据结构14-4分钟了解满二叉树和完全二叉树,后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树,又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树,怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值,新学期要从学习二叉树开始! | LeetCode:101. 对称二叉树icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1eW4y1B7pD

思路:正常二叉树是后序先求左右子树的节点数,再加1。但是因为完全二叉树的特性,我们可以先判断是否为满二叉树,如果是则直接得出节点数为2的数的高度次方-1,否则再按正常方法求节点数。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
            return getCountNode(root);
        }

        public int getCountNode(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int ldept = 0, rdept = 0;
            TreeNode temp = root;
            while (temp != null) {
                ldept++;
                temp = temp.left;
            }
            temp = root;
            while (temp != null) {
                rdept++;
                temp = temp.right;
            }
            if (ldept == rdept) {
                return (int) (Math.pow(2, ldept) - 1);
            }
            int lcount = getCountNode(root.left);
            int rcount = getCountNode(root.right);
            return lcount + rcount + 1;
        }
}

 

标签:TreeNode,val,随想录,二叉树,left,root,LeetCode,第十三天
From: https://blog.csdn.net/qq_73932604/article/details/143375639

相关文章

  • 代码随想录 -- 动态规划 -- 01背包理论基础
    46.携带研究材料(第六期模拟笔试)思路:dp[i][j]含义:在(0,i)之间任意选取物品放入容量为j的背包中,使背包的价值最大。递推公式:当前背包容纳不下第i个物品,不选第i个物品,此时背包的价值:dp[i][j]=dp[i-1][j]。当前背包容纳得下第i个物品时,且选择第i个物品,此时背包的价值:dp[i][j......
  • 给定一个二叉树,找出其最大深度
      文心快码(BaiduComate)是基于百度文心大模型,在研发全流程全场景下为开发者提供辅助建议的智能代码助手。结合百度积累多年的编程现场大数据、外部优秀开源数据,可为开发者生成更符合实际研发场景的优秀代码,提升编码效率,释放“十倍”软件生产力。......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录222.完全二叉树的节点个数给出一个完全二叉树,求出该树的节点个数。提供参数:根结点root主要操作:遍历所有节点,记录节点数。代码(递归法)大致如下:publicintcountNodes(TreeNoder......
  • 代码随想录算法训练营第十三天
    1二叉树的理论基础文章链接:代码随想录视频链接:关于二叉树,你该了解这些!|二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序_哔哩哔哩_bilibili1.1二叉树的种类满二叉树所有节点处的值都排满了,没有空的完全二叉树只有在最后一......
  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词哔哩哔哩bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • 代码随想录——栈与队列8-前K个高频元素
    法一、用数组排序思路用map保存元素和频率关系将元素和频率的键值对pair作为vector的基本元素,以频率为准进行从大到小的排序——O(nlogn)输出前K个pair的first,即数字本身代码classSolution{public:std::vector<int>topKFrequent(std::vector<int......
  • P 7-1 二叉树的遍历!(简单)
    二叉树作为FDS课程最核心的数据结构之一,要求每个人都掌握!这是一道简单的二叉树问题!我们将给出一颗二叉树,请你输出它的三种遍历,分别是先序遍历,中序遍历,后序遍历!输入格式:二叉树将以这样的形式给出:第一行给出一个正整数N(N<=100),表示二叉树上的节点个数!接下来N行,每行包含三......
  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......
  • 代码随想录一刷-day3
    T209长度最小子数组核心:滑动窗口思想,如何用一个for循环达到两个循环的效果for(intj=0;j<num.size();j++){sum+=nums[j];//外层for循环内负责将窗口结束的坐标++;while(sum>=target){window_length=j-i+1;result=min(result,window_length);sum-=nums[i++];......
  • 代码随想录day14 二叉树(2)
    文章目录day11栈与队列(2)栈与队列的总结day13二叉树(1)day14二叉树(2)day11栈与队列(2)逆波兰表达式求值https://leetcode.cn/problems/evaluate-reverse-polish-notation/逆波兰表达式,也就是后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种......