二叉树oj题解析

news2024/11/26 17:12:50

二叉树

  • 二叉树的最近公共祖先
    • 什么是最近公共祖先?
    • leetcode中求二叉树中最近公共祖先
      • 解题1.
      • 解题2.
  • 根据二叉树创建字符串

二叉树的最近公共祖先

什么是最近公共祖先?


最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节点。
也就是说这两个节点在树中距离最近的相交
例如:8 与6中的最近公共节点为2,因为他的最大深度就是2(在同一颗子树中)。
8与4的最近公共节点为3,因为他的最大深度是3(在左右两棵子树中的情况)。

在这里插入图片描述

leetcode中求二叉树中最近公共祖先

在这里插入图片描述

解题1.

公共祖先的三种形式:
1.题中可知:如果root根节点为q或者p,root这个节点就是最近的公共祖先节点。
2.如果p和q各自在原根节点的左右两棵子树中,则原根节点就是p和q的最近公共祖先。
3.如果p和q在根节点的同一颗子树中,则p和q的相遇之后两个节点最大深度且相交平行的第一个节点,就是最近公共祖先

在这里插入图片描述

  public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null)return null;
        //q或者p如果在其中的根节点上直接返回
       if(root==p||root==q)return root;
       //向左开始递归每一棵左右树
     TreeNode leftTree = lowestCommonAncestor(root.left,p,q);
    TreeNode rightTree= lowestCommonAncestor(root.right,p,q);
       //说明两棵树都不为null
       if(leftTree!=null&&rightTree!=null){
        return root;
       }else if(leftTree!=null){
        return leftTree;
       }else{
        return rightTree;
       }
    }
}

解题2.

前面我们也说过p和p两个节点的最大深度就是它两个的最近公共祖先,也就是相交的节点,这里的B就是它们两个的公共祖先。
那我们为什么不能将两个节点的以相同的距离开始走,最后两个节点的值相同就是最近公共祖先

在这里插入图片描述
假如两个节点到最近公共祖先的距离相同。
我们可以创建两个栈分别来存储到达p和q距离的所有节点,假设距离相同后pop出栈,如果出栈过程中两个节点的值相同就是它两个的公共祖先了。
在这里插入图片描述
这里我们如果遇到了多余的子树节点就返回false,并将其出栈,然后继续找p或者q节点找到后直接返回true。
在这里插入图片描述

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null)return null;
        Stack<TreeNode> stackP=new Stack<>();
        Stack<TreeNode> stackQ=new Stack<>();
        getTNodeLocation(root,stackP,p);
        getTNodeLocation(root,stackQ,q);
        //获取两个栈点的大小
        int sizeP=stackP.size();
        int sizeQ=stackQ.size();
        if(sizeP>sizeQ){
            int size = sizeP-sizeQ;
            while(size!=0){
                stackP.pop();
                size--;
            }
        }else{
            int size = sizeQ-sizeP;
           while(size!=0){
             stackQ.pop();
            size--;
           }
        }
        //找到两者的最近公共祖先
        while(!stackQ.isEmpty()&&!stackP.isEmpty()){
            if(stackQ.peek()==stackP.peek()){
                return stackQ.peek();
            }else{
                stackQ.pop();
                stackP.pop();
            }
        }
        return null;
    }
    //将指定的节点放入到栈中
    private boolean getTNodeLocation(TreeNode root,Stack stack,TreeNode t){
        //如果为null,返回给上一个节点false
        if(root==null)return false;
        stack.push(root);//走一步放入栈一个节点
        if(root==t)return true;//这里root如果为t直接返回
       boolean judg1 =  getTNodeLocation(root.left,stack,t);
       if(judg1==true)return true;
       boolean judg2 =  getTNodeLocation(root.right,stack,t);
       if(judg2==true)return true;
       stack.pop();//这里将出多余的节点出栈
       return false;
    }

根据二叉树创建字符串

在这里插入图片描述
这里的题意:对二叉树根节点进行前序的遍历,将遍历到的子树通过括号括起来,如果左子树有节点但是右子树没有节点,则将多余的右子树的括号省略,当右子树有节点但是左子树没有节点时,将左子树节点的括号添加进去。
这里的条件是:1.左子树如果为空,右子树不为空时,左右子树都有括号。
2.左子树不为空时,右子树为空,则可以忽略右树括号。

在这里插入图片描述

   public String tree2str(TreeNode root) {
        StringBuilder sb=new StringBuilder();
        tree2strChild(root,sb);
        return sb.toString();
    }
    public void tree2strChild(TreeNode root,StringBuilder sb){
        if(root==null)return;
        sb.append(root.val);
        if(root.left!=null){
        sb.append("(");
        tree2strChild(root.left,sb);
        sb.append(")");
        }else{
            if(root.right!=null){
                sb.append("()");
            }
        }
        if(root.right!=null){
            sb.append("(");
            tree2strChild(root.right,sb);
            sb.append(")");
        }
    }

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=121ff85d13ss0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI赋能电商:构建高效、智能化的新零售生态

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;其在电商领域的应用日益广泛&#xff0c;从购物推荐到供应链管理&#xff0c;再到商品定价&#xff0c;AI正在全面改变传统电商的运营模式&#xff0c;并推动行业向智能化和精细化方向发展。本文将探讨如何利…

【从零开始的LeetCode-算法】43. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

【数据结构】树——链式存储二叉树的基础

写在前面 书接上文&#xff1a;【数据结构】树——顺序存储二叉树 本篇笔记主要讲解链式存储二叉树的主要思想、如何访问每个结点、结点之间的关联、如何递归查找每个结点&#xff0c;为后续更高级的树形结构打下基础。不了解树的小伙伴可以查看上文 文章目录 写在前面 一、链…

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

重新定义社媒引流:AI社媒引流王如何为品牌赋能?

在社交媒体高度竞争的时代&#xff0c;引流已经不再是单纯追求流量的数字游戏&#xff0c;而是要找到“对的用户”&#xff0c;并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略&#xff0c;重新定义了社媒引流的方式&#xff0c;帮助品牌在精准触达和高效互动中脱…

centos 服务器 docker 使用代理

宿主机使用代理 在宿主机的全局配置文件中添加代理信息 vim /etc/profile export http_proxyhttp://127.0.0.1:7897 export https_proxyhttp://127.0.0.1:7897 export no_proxy"localhost,127.0.0.1,::1,172.171.0.0" docker 命令使用代理 例如我想在使用使用 do…

WebRTC音视频同步原理与实现详解(上)

第一章、RTP时间戳与NTP时间戳 1.1 RTP时间戳 时间戳&#xff0c;用来定义媒体负载数据的采样时刻&#xff0c;从单调线性递增的时钟中获取&#xff0c;时钟的精度由 RTP 负载数据的采样频率决定。 音频和视频的采样频率是不一样的&#xff0c;一般音频的采样频率有 8KHz、…

Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程

clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…

神经网络(系统性学习二):单层神经网络(感知机)

此前篇章&#xff1a; 神经网络中常用的激活函数 神经网络&#xff08;系统性学习一&#xff09;&#xff1a;入门篇 单层神经网络&#xff08;又叫感知机&#xff09; 单层网络是最简单的全连接神经网络&#xff0c;它仅有输入层和输出层&#xff0c;没有隐藏层。即&#x…

构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)

第 1 部分&#xff1a;环境设置 安装 Java Development Kit (JDK)&#xff1a;下载并安装 JDK。设置 IDE&#xff1a;安装并配置 IDE&#xff08;如 IntelliJ IDEA 或 Eclipse&#xff09;。安装数据库&#xff1a;下载并安装 MySQL 数据库。配置数据库&#xff1a;创建数据库…

进程间通信5:信号

引入 我们之前学习了信号量&#xff0c;信号量和信号可不是一个东西&#xff0c;不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的&#xff0c;无法预测信号可以临时保存下来&#xff0c;之后再处理信号是异步发送的…

jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js

参考资料&#xff1a; jQuery-Word-Export导出word_jquery.wordexport.js下载-CSDN博客 近期又需要自己做个 Html2Doc 的解决方案&#xff0c;因为客户又不想要 Html2pdf 的下载了&#xff0c;当初还给我费尽心思解决Html转pdf时中文输出的问题&#xff08;html转pdf文件下载之…

docker镜像、容器、仓库介绍

docker docker介绍docker镜像命令docker容器命令docker仓库 docker介绍 官网 Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为“容器”的单一包中&#xff0c;使得应用能够在任何环境下运行&#xff0c;不受底层系…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类&#xff1a;编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值的称为编码键盘&#xff0c;如&#xff1a;计算机键盘。靠软件编程识别的称为非编码键盘&#xff1b;在单片机组成…

嵌入式驱动开发详解3(pinctrl和gpio子系统)

文章目录 前言pinctrl子系统pin引脚配置pinctrl驱动详解 gpio子系统gpio属性配置gpio子系统驱动gpio子系统API函数与gpio子系统相关的of函数 pinctrl和gpio子系统的使用设备树配置驱动层部分用户层部分 前言 如果不用pinctrl和gpio子系统的话&#xff0c;我们开发驱动时需要先…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能&#xff0c;基于 ARM Corte…

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司&#xff08;简称&#xff1a;百易云&#xff09;成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业&#xff0c;公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

Spring Boot 实战:基于 Validation 注解实现分层数据校验与校验异常拦截器统一返回处理

1. 概述 本文介绍了在spring boot框架下&#xff0c;使用validation数据校验注解&#xff0c;针对不同请求链接的前端传参数据&#xff0c;进行分层视图对象的校验&#xff0c;并通过配置全局异常处理器捕获传参校验失败异常&#xff0c;自动返回校验出错的异常数据。 2. 依赖…

量子神经网络

感知机只是一个神经元&#xff0c;若有多个神经元共同作用&#xff0c;则构成神经网络。目前&#xff0c;最常见的量子神经网络模型为基于参数化量子线路的量子神经网络&#xff0c;该模型用参数化量子线路代替神经网络结构&#xff0c;使用经典优化算法更新参数化量子线路的参…