leetcode刷题(10)二叉树(4)

news2024/9/21 12:23:37

各位朋友们,大家五一劳动节快乐啊,在这里祝大家假期玩得愉快!但是在玩耍的期间不要忘记了敲代码哦。今天我为大家分享的是二叉树的第四篇,废话不多说,我们一起来看看吧。

文章目录

  • 二叉树的最近公共祖先
    • 题目要求
    • 做题思路
      • 方法一
        • 代码实现
      • 方法二
        • 代码实现
  • 根据二叉树创建字符串
    • 题目要求
    • 做题思路

二叉树的最近公共祖先

leetcode之二叉树的最近公共祖先(难度:中等)

题目要求

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:
在这里插入图片描述

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2:
在这里插入图片描述

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        
    }
}

做题思路

做这个题呢,我们有两种方法:

方法一

通过root根节点的移动在左子树和右子树中来找这两个节点,如果这两个节点分别在左子树和右子树中,我们就返回根节点,如果这两个节点都在左子树或者右子树,我们就返回那个深度更大的节点,这个节点就是两个节点的最近公共祖先。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) {
            return null;
        }
        if(root == p || root == q) {
            return root;
        }

        TreeNode leftRet = lowestCommonAncestor(root.left,p,q);
        TreeNode rightRet = lowestCommonAncestor(root.right,p,q);
        if(leftRet != null && rightRet != null) {
            return root;
        }else if(leftRet != null) {
            return leftRet;
        }else {
            return rightRet;
        }
    }
}

在这里插入图片描述

方法二

第二种方法我们可以借用栈这种数据结构来解决,我们可以将从根节点到这两个节点路径上的节点分别放在两个栈中。然后得到了两个栈之后,我们比较栈中元素的大小,将栈中元素较大的站里面的元素弹出部分,使两个栈中的元素数量相等,接着我们就同时弹出两个栈中的元素并进行比较,如果相等就说明这个节点就是最近公共祖先。

但是我们怎样准确的将从根节点到该节点路径上的节点存放在栈中呢?

就像这个例子,我们需要找到节点5和节点4的公共祖先。
在这里插入图片描述
当我们找节点5路径上的节点时很容易找到,但是4呢?我们知道从根节点到节点4的路径的节点有3,5,2,4,但是我们怎样做才能不把6和7也算上呢?我们这样,当我们遍历完了5这个节点的左子树时,如果该节点的左子树或者右子树没有找到我们要找的两个节点,我们就将该左子树或者右子树上的节点从栈中弹出,最后栈中就只有从根节点到需要找的节点路径上的节点了。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        Deque<TreeNode> stack1 = new ArrayDeque<>();
        Deque<TreeNode> stack2 = new ArrayDeque<>();
        lowestCommonAncestorChild(root,p,stack1);
        lowestCommonAncestorChild(root,q,stack2);
        int len = stack1.size() - stack2.size();
        if(len < 0) {
            len = -len;
            while(len > 0) {
                stack2.pop();
                len--;
            }
        }else {
            while(len > 0) {
                stack1.pop();
                len--;
            }
        }
        while(!stack1.isEmpty()) {
            if(stack1.peek() == stack2.peek()) {
                return stack1.peek();
            }
            stack1.pop();
            stack2.pop();
        }
        return null;
    }

    private boolean lowestCommonAncestorChild(TreeNode root,TreeNode node,Deque stack) {
        if(root == null) {
            return false;
        }
        stack.push(root);
        if(root == node) {
            return true;
        }
        boolean ret1 = lowestCommonAncestorChild(root.left,node,stack);
        //当我们在该节点的左树中找到了需要找的节点,说明该节点不需要弹出,
        //我们直接返回,节省时间
        if(ret1 == true) {
            return true;
        }
        boolean ret2 = lowestCommonAncestorChild(root.right,node,stack);
        if(ret2 == true) {
            return true;
        }
        //当该节点的左树和右树都没有时,我们就需要弹出该节点
        stack.pop();
        return false;
    }
}

在这里插入图片描述

根据二叉树创建字符串

根据二叉树创建字符串(难度:简单)

题目要求

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:
在这里插入图片描述

输入:root = [1,2,3,4]
输出:“1(2(4))(3)”
解释:初步转化后得到 “1(2(4)())(3()())” ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

示例 2:
在这里插入图片描述

输入:root = [1,2,3,null,4]
输出:“1(2()(4))(3)”
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

/**
 * 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 String tree2str(TreeNode root) {

    }
}

做题思路

根据实例我们可以知道,当根节点的左树和右树不为null时,我们需要在添加节点之前加入一个
“(”,当左树或者右树遍历完之后我们加上")“。当左树不为null时,我们正常进行遍历;当左树为null,右树不为null时,我们需要添加”()",然后再遍历右子树,当右树不为null时,我们正常加
“(“和”)”,当右树为null时,什么都不需要做。

/**
 * 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 String tree2str(TreeNode root) {
        StringBuilder str = new StringBuilder();
        tree2strChild(root,str);
        return str.toString();
    }

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

在这里插入图片描述

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

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

相关文章

Stable Diffusion Controlnet V1.1 的14种基础标志用法

用于ControlNet和其他基于注入的SD控件的WebUI扩展。 针对 AUTOMATIC1111 的 Stable Diffusion web UI 网络用户界面的扩展&#xff0c;它可以让网络界面在原始的 Stable Diffusion 模型中添加 ControlNet 条件来生成图像。这种添加是实时的&#xff0c;不需要进行合并。 Con…

【openAI】Whisper如何高效语音转文字(详细教程)

文章目录 前言一、准备二、使用Whisper进行语音转文字三.Whisper转换结果分析总结 前言 语音转文字在许多不同领域都有着广泛的应用。以下是一些例子&#xff1a; 1.字幕制作&#xff1a;语音转文字可以帮助视频制作者快速制作字幕&#xff0c;这在影视行业和网络视频领域非常…

【软件下载】换新电脑记录下下载的软件时所需地址

1.idea https://www.jetbrains.com/zh-cn/idea/download/other.html 2.oracle官方&#xff08;下载jdk时找的&#xff09; https://www.oracle.com/ 3.jdk8 https://www.oracle.com/java/technologies/downloads/ 下拉找到jdk8 切换windows &#xff08;需要注册个oracle账…

TabError: inconsistent use of tabs and spaces in indentation

错误原因是tab制表符和空格混用了。从其他地方复制源码容易出现此错误 解决办法&#xff1a;把处于同级缩进的所有缩进修改统一 比较流行的几个编辑器都能标识tab和空格&#xff0c;比如我用的vscode 用鼠标框选不知道是tab还是空格的部分。 若是空格则显示为上图73行所示的点…

自动化运维工具一Ansible Roles实战

目录 一、Ansible Roles概述 1.1.roles官方的目录结构 1.2.Ansible Roles依赖关系 二、Ansible Roles案例实战 2.1.Ansible Roles NFS服务 2.2 Roles Memcached 2.3 Roles-rsync服务 一、Ansible Roles概述 之前介绍了 Playbook 的使用方法&#xff0c;对于批量任务的部…

C++程序设计——常见C++11新特性

一、列表初始化 1.C98中{}的初始化问题 在C98中&#xff0c;允许使用花括号{}对数组元素进行统一的列表初始化值设定&#xff0c;比如&#xff1a; 但是对于一些自定义类型&#xff0c;就无法使用这样的方式进行初始化了&#xff0c;比如&#xff1a; 就无法通过编译&#xff…

HIT-CSAPP实验二gdb和edb的配置

笔者只是根据自己的电脑进行环境的配置&#xff0c;不一定适配所有的电脑&#xff0c;也不是万能的方法&#xff0c;如果读者使用本人的方法没有配置成功本人深表抱歉。 gdb的使用 通过网上查阅一些资料获得 gdb查看内存和寄存器以及中断设置&#xff08;转&#xff09;_gdb…

关于安装PicGo后启动无界面问题

关于安装PicGo后启动无界面问题 其实我遇到的这个也不算是问题&#xff0c;也挺无语的。 最近为了搭建图床&#xff0c;需要使用PicGo&#xff0c;第一次搭建图床也是第一次使用PicGo。在安装了PicGo后发现启动不了&#xff0c;查看后台发现PicGo在运行着&#xff0c;但是没有界…

数据结构与算法九 树进阶

一 平衡树 之前我们学习过二叉查找树&#xff0c;发现它的查询效率比单纯的链表和数组的查询效率要高很多&#xff0c;大部分情况下&#xff0c;确实是这样的&#xff0c;但不幸的是&#xff0c;在最坏情况下&#xff0c;二叉查找树的性能还是很糟糕。 例如我们依次往二叉查找…

User Experience Design and Information Architecture

&#x1f4a5;(1) What is IA (Information Architecture)? Definition of four sentences I. Information Architecture is "The structure design of shared informaiton environments-共享信息环境的结构设计" II. Information Architecture is "The sy…

ChatGPT提示词工程(三):Summarizing概括总结

目录 一、说明二、安装环境三、概括总结&#xff08;Summarizing&#xff09;1. 简单地概括总结&#xff0c;只有字数限制2. 概括总结需要关注的某些点 四、用“提取”代替“总结”&#xff08;Try "extract" instead of "summarize"&#xff09;五、概括总…

Mysql第二章 多表查询的操作

这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接&#xff0c;把没有部门的员工也查出来sql99语法实现右外连接&#xff0c;把没有人的部门查出来sql99语法实现满外连接&#xff0c;mysql不支持这样写mysql中如果要实现满外连接的…

生成对抗网络原理

GAN的原理 GAN是在2014年由Ian Goodfellow等人提出的&#xff0c;发表在论文“Generative Adversarial Networks”中。 GAN的主要灵感来源于博弈论中零和博弈的思想&#xff0c;应用到深度学习神经网络上来说&#xff0c;就是通过生成网络G&#xff08;Generator&#xff09;和…

系统架构设计

高性能 客户端内部缓存客户端到服务器之间缓存&#xff1a;CDN,网络专线数据库前加缓存Sessioin等信息共享NoSQL数据库分片&#xff0c;读写分离web层无关态集群负载均衡GeoDNS 就近原则&#xff0c;边缘计算存储异步&#xff0c;解耦&#xff0c;削峰&#xff1a;消息队列离线…

MySQL学习笔记第五天

第06章多表查询 多表查询概述&#xff1a; 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0…

第二十章 渲染管线

渲染管线是计算机图形中最基础最核心的部分&#xff0c;它是将3D场景显示到2D平面的技术过程。在DirectX课程中&#xff0c;我们就介绍了渲染管线&#xff0c;分为固定渲染管线和可编程渲染管线&#xff08;Shader&#xff09;。但是在DirectX 10版本之后统一了渲染架构&#x…

【Java】面试常问知识点(Java基础)

JVM java 栈&#xff1a;线程私有&#xff0c;生命周期和线程&#xff0c;每个方法在执行的同时都会创建一个 栈帧用于存储局部变量表&#xff0c;操作数栈&#xff0c;动态链接&#xff0c;方法出口等信息。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程&#xff1b;栈…

Photoshop如何使用蒙版之实例演示?

文章目录 0.引言1.给单调的天空添加蓝天白云2.清除头发边缘的杂色3.制作景深效果4.制作枯荣共存的树5.制作双重曝光肖像 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行…

【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释

源码 解释1 static int __ref kernel_init(void *unused): 声明一个静态整型函数kernel_init()&#xff0c;该函数不会被其他文件访问&#xff0c;使用__ref标记表示该函数是可重定位的&#xff0c;并且该函数不需要任何参数。 wait_for_completion(&kthreadd_done);: 等待…

FL Studio 2023中文高级版水果编曲软件下载

FL Studio 2023中文版是一款非常经典的音乐制作软件&#xff0c;这款软件除了可以为用户提供全面的音乐制作功能之外&#xff0c;还有丰富的主题和皮肤供用户选择&#xff0c;让用户不但做出的音乐具有自己的风格&#xff0c;连制作的音乐的过程也个性十足&#xff0c;非常适合…