菜鸡的原地踏步史02(◐‿◑)

每日一念
改掉自己想到哪写哪的坏习惯

二叉树

二叉树的中序遍历

class Solution {
    /**
        中序遍历
        左 - 中 - 右
     */
    private List<Integer> res =  new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        if(root == null) {
            return res;
        }
        tranverse(root);
        return res;
    }
    public void tranverse(TreeNode node) {
        if(node == null) {
            return;
        }
        tranverse(node.left);
        res.add(node.val);
        tranverse(node.right);
    }
}

二叉树的最大深度

class Solution {
    /**
        比较左右子树深度,取最大值,还要加上root的1
     */
    int max = 0;
    public int maxDepth(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return tranverse(root);
    }
    public int tranverse(TreeNode node) {
        if(node == null) {
            return 0;
        }
        int left = tranverse(node.left);
        int right = tranverse(node.right);
        max = Math.max(left, right) + 1;
        return max;
    } 
}

翻转二叉树

class Solution {
    /**
        递归的每一层在干什么
        在交换结点
     */
    public TreeNode invertTree(TreeNode root) {
        tranverse(root);
        return root;
    }
    public void tranverse(TreeNode node) {
        if(node == null) {
            return;
        }
        TreeNode temp = null;
        temp = node.left;
        node.left = node.right;
        node.right = temp;
        tranverse(node.left);
        tranverse(node.right);
    }
}

对称二叉树

class Solution {
    /**
        每一层在干什么?
        判断左子树结点和右子树结点是否值相同
     */
    public boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return true;
        }
        return tranverse(root.left, root.right);
    }
    public boolean tranverse(TreeNode left, TreeNode right) {
        if(left == null && right != null) {
            return false;
        }
        if(left != null && right == null) {
            return false;
        }
        if(left == null && right == null) {
            return true;
        }
        if(left.val != right.val) {
            return false;
        }
        boolean l = tranverse(left.left, right.right);
        boolean r = tranverse(left.right, right.left);
        return l && r;
    }

}

二叉树的直径

class Solution {
    /**
        
     */
    int maxlen = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        tranverse(root);
        return maxlen;
    }
    public int tranverse(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = tranverse(root.left);
        int right = tranverse(root.right);
        maxlen = Math.max(left + right, maxlen);
        return Math.max(left, right) + 1;
    }
}

二叉树的层序遍历

class Solution {
    /**
        每一层保存root结点的值
     */
    List<List<Integer>> res = new ArrayList();
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null) {
            return res;
        }
        tranverse(root, 0);
        return res;
    }
    public void tranverse(TreeNode root, int depth) {
        if(root == null) {
            return;
        }
        if(res.size() <= depth) {
            res.add(new ArrayList<>());
        }
        res.get(depth).add(root.val);
        tranverse(root.left, depth + 1);
        tranverse(root.right, depth + 1);
    }
}

将有序数组转化为二叉搜索树

class Solution {
    /**
        每一层要做什么
        提取目前nums的根节点,建立左右子树
     */
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums == null || nums.length == 0) {
            return null;
        }
        return tranverse(nums, 0, nums.length - 1);
    }
    public TreeNode tranverse(int[] nums, int start, int end) {
        if(start > end) {
            return null;
        }
        int mid = (start + end) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = tranverse(nums, start, mid - 1);
        root.right = tranverse(nums, mid + 1, end);
        return root;
    }
}

验证二叉搜索树

class Solution {
    /**
        每层在做什么
        可以类比前面将nums分段的,这题是在比较root.val和min、max
     */
    public boolean isValidBST(TreeNode root) {
        return tranverse(root, null, null);
    }

    public boolean tranverse(TreeNode root, Integer min, Integer max) {
        if(root == null) {
            return true;
        }
        if((min != null && root.val <= min) || (max != null && root.val >= max)) {
            return false;
        }
        boolean left = tranverse(root.left, min, root.val);
        boolean right = tranverse(root.right, root.val, max);
        return left && right;
    }
}

二叉搜索树中第k小的元素

class Solution {
    /**
        简单朴素的想法
        将所有元素装到list里面,排序后找出第k-1个元素
     */
    List<Integer> list = new ArrayList<>();
    public int kthSmallest(TreeNode root, int k) {
        tranverse(root);
        Collections.sort(list);
        return list.get(k - 1);
    }
    public void tranverse(TreeNode root) {
        if(root == null) {
            return;
        }
        list.add(root.val);
        tranverse(root.left);
        tranverse(root.right);
    }
}

二叉树的右视图

class Solution {
    /**
        每一层在做什么?
        先右子树depth++,再左子树depth--
        res.size() < depth时,没存这层的结点值,需要存一下
     */
    List<Integer> res = new ArrayList<>();
    int depth = 0;
    public List<Integer> rightSideView(TreeNode root) {
        tranverse(root);
        return res;
    }
    public void tranverse(TreeNode root) {
        if(root == null) {
            return;
        }
        depth++;
        if(res.size() < depth) {
            res.add(root.val);
        }
        tranverse(root.right);
        tranverse(root.left);
        depth--;
    }
}

二叉树展开为链表

class Solution {
    /**
        每一层在干什么?
        将左子树结点移到右子树root.right
        右子树移到root右子树的最后结点.right
            2
           /  \
          3    4

          2
           \
            3    4

          2
           \
            3
             \
              4

     */
    public void flatten(TreeNode root) {
        if(root == null) {
            return;
        }

        flatten(root.left);
        flatten(root.right);

        TreeNode node_left = root.left;
        TreeNode node_right = root.right;

        root.left = null;
        root.right = node_left;

        TreeNode newRoot = root;
        while(newRoot.right != null) {
            newRoot = newRoot.right;
        }
        newRoot.right = node_right;
        
    }
}

从前序和中序遍历构造二叉树

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return tranverse(preorder, 0, preorder.length - 1,
         inorder, 0, inorder.length - 1);
    }
    public TreeNode tranverse(int[] preorder, int preStart, int preEnd,
     int[] inorder, int inStart, int inEnd) {
        if(preStart > preEnd) {
            return null;
        }
        int rootValue = preorder[preStart];
        TreeNode root = new TreeNode(rootValue);
        int rootIndex = 0;
        for(int i = inStart; i <= inEnd; i++) {
            if(inorder[i] == rootValue) {
                rootIndex = i;
            }
        }
        int leftLen = rootIndex - inStart;
        int rightLen = inEnd - rootIndex;
        root.left = tranverse(preorder, preStart + 1, preStart + leftLen
        , inorder, inStart, rootIndex - 1);
        root.right = tranverse(preorder, preStart + leftLen + 1, preEnd
        , inorder, rootIndex + 1, inEnd);
        return root;
     }
}

路径总和III

class Solution {
    /**
    	每一层在做什么?
    	dps1到一层的根节点,dps2往下搜寻有没有和=targertSum的
        需要注意测试用例
        int转成long类型
     */
    int ans = 0;
    int target = 0;
    public int pathSum(TreeNode root, int targetSum) {
        target = targetSum;
        dps1(root);
        return ans;
    }
    public void dps1(TreeNode root) {
        if(root == null) {
            return;
        }
        dps2(root, root.val);
        dps1(root.left);
        dps1(root.right);
    }
    public void dps2(TreeNode root, long t) {
        if(t == target) {
            ans++;
        }
        if(root.left != null) {
            dps2(root.left, root.left.val + t);
        }
        if(root.right != null) {
            dps2(root.right, root.right.val + t);
        }
    }
}

二叉树的最近公共祖先

class Solution {
    /**
        每一层都在做什么?
        left记录找到的最近左祖先,right记录找到的最近右祖先

        left right都有 -- 祖先root
        只在left -- 返回left
        只在right -- 返回right
        都没有 -- 返回null
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q) {
            return root;
        }
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left != null && right != null) {
            return root;
        }
        else if(left != null) {
            return left;
        }
        else if(right != null) {
            return right;
        }
        else {
            return null;
        }
    }
}

二叉树中最大路径和

class Solution {
    /**
        难题直接灵神yyds
        看了灵神的题解,其实和最大深度差不多(真的 QAQ
     */
    int ans = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        dps(root);
        return ans;
    }
    public int dps(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int leftValue = dps(root.left);
        int rightValue = dps(root.right);
        ans = Math.max(ans, leftValue + rightValue + root.val);
        return Math.max(Math.max(leftValue, rightValue) + root.val, 0);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java并发编程知识整理笔记

目录 ​1. 什么是线程和进程&#xff1f; 线程与进程有什么区别&#xff1f; 那什么是上下文切换&#xff1f; 进程间怎么通信&#xff1f; 什么是用户线程和守护线程&#xff1f; 2. 并行和并发的区别&#xff1f; 3. 创建线程的几种方式&#xff1f; Runnable接口和C…

pycharm如何使用jupyter

目录 配置jupyter新建jupyter文件别人写的方法&#xff08;在pycharm种安装&#xff0c;在网页中使用&#xff09; pycharm专业版 配置jupyter 在pycharm终端启动一个conda虚拟环境&#xff0c;输入 conda install jupyter会有很多前置包需要安装&#xff1a; 新建jupyter…

中国IDC圈探访北京•光子1号金融算力中心

今天&#xff0c;“AI”、“大模型”是最炙手可热的话题&#xff0c;全球有海量人群在工作生活中使用大模型&#xff0c;大模型产品涉及多模态&#xff0c;应用范围已涵盖电商、传媒、金融、短视频、制造等众多行业。 而回看2003年的互联网记忆&#xff0c; “上网”“在线”是…

空状态页面设计的艺术与科学

空状态界面是用户在网站、APP中遇到的因无数据展示而中断体验的界面&#xff0c;这个界面设计对于解决用户疑惑有着很大的帮助。那么我们应该如何设计空状态界面呢&#xff1f;空状态是指在界面设计中&#xff0c;没有内容或数据时所显示的状态。它可能出现在各种情况下&#x…

可视化大屏的强势在于预警和感知的科学依据可靠性强

**可视化大屏的强势&#xff1a;预警与感知的科学依据可靠性探究** 数据可视化已成为信息传递的重要手段。其中&#xff0c;可视化大屏作为一种直观、高效的展示方式&#xff0c;广泛应用于各个领域&#xff0c;如智慧城市、智慧交通、智慧医疗等。可视化大屏的强势不仅体现在…

【最详细】PhotoScan(MetaShape)全流程教程

愿天下心诚士子&#xff0c;人人会PhotoScan&#xff01; 愿天下惊艳后辈&#xff0c;人人可剑开天门&#xff01; 本教程由CSDN用户CV_X.Wang撰写&#xff0c;所用数据均来自山东科技大学视觉测量研究团队&#xff0c;特此鸣谢&#xff01;盗版必究&#xff01; 一、引子 Ph…

振弦式多点位移计是什么?有什么作用?

在复杂的工程结构监测中&#xff0c;位移、沉降、应变等参数的精确测量对于确保工程安全和质量至关重要。振弦式多点位移计作为一种高精度、高可靠性的测量工具&#xff0c;广泛应用于桥梁、隧道、大坝、高层建筑等各类工程结构的健康监测中。南京峟思将给大家详细介绍振弦式多…

抖音同款网红告白小工具(附源码带下载链接)

抖音同款表白小程序 仿抖音同款表白小程序&#xff0c;在 [Python让你的表白更浪漫&#xff01;&#xff01;] 打包好的可执行文件下载&#xff08;包括win和mac&#xff09;&#xff1a;https://pan.baidu.com/s/1Y9kccxtXrskrA5L7gqCaFg 效果演示&#xff1a; 以下为源代码&a…

TK养号工具开发会用上的源代码科普!

在当今数字化时代&#xff0c;社交媒体平台的崛起使得网络账号的维护与管理变得日益重要&#xff0c;其中&#xff0c;TK作为一款备受欢迎的社交媒体平台&#xff0c;吸引了大量用户。 在TK上进行账号养护&#xff0c;即通过各种方式提升账号权重、增加曝光量&#xff0c;已成…

nginx部署多个项目;vue打包项目部署设置子路径访问;一个根域名(端口)配置多个子项目

本文解决&#xff1a; vue打包项目部署设置子路径访问&#xff1b;nginx部署多个子项目&#xff1b;一个ip/域名 端口 配置多个子项目&#xff1b;配置后&#xff0c;项目能访问&#xff0c;但是刷新页面就丢失的问题 注&#xff1a;本文需要nginx配置基础。基础不牢的可见文…

SEELE框架:图像中主体重定位的创新方法

现有的图像编辑工具多集中于静态调整&#xff0c;如替换图像中的特定区域或改变整体风格&#xff0c;对于动态调整——特别是图像中主体的位置变化则显得力不从心。这种局限性激发了对更加先进和灵活的图像编辑技术的探索。复旦大学数据科学学院的研究团队提出了一种名为SEELE的…

jmeter-beanshell学习1-vars使用获取变量和设置变量

最近又开始了用jmeter做自动化&#xff0c;不管怎么实现&#xff0c;都逃离不了用beanshell&#xff0c;最后把所有校验都放在了beanshell判断&#xff0c;效果还不错。 首先jmeter有很多beanshell相关的元件&#xff0c;取样器、前置处理器、后置处理器、断言&#xff0c;暂时…

把Windows打造成一个NTP网络时间服务器,为网关提供校时服务

把Windows打造成一个NTP网络时间服务器&#xff0c;为网关提供校时服务。主要目的是为了解决&#xff1a;当网关不能上外网的时候&#xff0c;可以使用局域网的电脑来当做NTP服务器&#xff0c;实现校时功能。 跟着小编来看&#xff0c;如何使用NTP网络时间服务器来同步时间。 …

推荐3款Windows系统的神级软件,免费、轻量、绝对好用!

DiskView DiskView是一款用于管理和查看磁盘空间的工具&#xff0c;它集成了于微软的Windows操作系统资源管理器中&#xff0c;以显示直观的磁盘空间使用情况。该软件通过生成图形化地图&#xff0c;帮助用户组织和管理大量文件和文件夹&#xff0c;从而高效地管理磁盘空间。用…

数字信号处理及MATLAB仿真(2)——离散系统

上回书说到如何来编写一些简单的离散时间序列&#xff0c;今天咱们就来谈谈一些关于常系数差分方程的操作吧。 说到这里咱们对于常系数差分方程可能最关心的就是怎么去求解了。 其中最关键的部分就是filter函数&#xff0c;可以用来计算系统在输入信号为x的输出信号y。大家学过…

【C++】日期类

鼠鼠实现了一个日期类&#xff0c;用来练习印证前几篇博客介绍的内容&#xff01;&#xff01; 目录 1.日期类的定义 2.得到某年某月的天数 3.检查日期是否合法 4.&#xff08;全缺省&#xff09;构造函数 5.拷贝构造函数 6.析构函数 7.赋值运算符重载 8.>运算符重…

elasticsearch-users和elasticsearch-reset-password介绍

elasticsearch 内置 elastic, kibana, logstash_system,beats_system 共4个用户&#xff0c;用途如下&#xff1a; elastic 账号&#xff1a;内置的超级用户&#xff0c;拥有 superuser 角色。 kibana 账号&#xff1a;用来连接 elasticsearch 并与之通信。Kibana 服务器以该用…

分享超级实用的3款AI工具,让工作效率轻松翻倍

Hey&#xff0c;职场小伙伴们&#xff01;每天被堆积如山的工作压得喘不过气&#xff1f;加班成了日常&#xff0c;效率却不见提高&#xff1f;别急&#xff0c;今天就让我来给你们揭秘3款AI神器&#xff0c;它们将是你职场上的得力助手&#xff0c;让你的工作效率轻松翻倍&…

政务单位网站SSL证书选择策略

在数字化快速发展的今天&#xff0c;政务单位网站作为政府与公众沟通的重要桥梁&#xff0c;其安全性和可信度显得尤为重要。SSL证书作为保障网站安全的重要手段&#xff0c;其选择对于政务单位网站来说至关重要。本文将探讨政务单位网站在选择SSL证书时应该考虑的因素&#xf…

2024暑假集训第四次考试(终极测试)

作者的话 虽然这是最后一次考试&#xff0c;也是10天暑假集训的终极测试&#xff0c;但是题目难度反而没那么高&#xff0c;这里的难度是思考深度&#xff0c;但是主要是广范围的考所学知识的简单应用&#xff08;也就是基本都是模版题的应用&#xff0c;只不过知识面广&#x…