leetcode--二叉树中的最长交错路径

news2024/11/19 6:32:53

leetcode地址:二叉树中的最长交错路径
给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:

选择二叉树中 任意 节点和一个方向(左或者右)。
如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
改变前进方向:左变右或者右变左。
重复第二步和第三步,直到你在树中无法继续移动。
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。

请你返回给定树中最长 交错路径 的长度。

示例 1:

在这里插入图片描述

输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
示例 2:

在这里插入图片描述

输入:root = [1,1,1,null,1,null,null,1,1,null,1]
输出:4
解释:蓝色节点为树中最长交错路径(左 -> 右 -> 左 -> 右)。
示例 3:

输入:root = [1]
输出:0

提示:

每棵树最多有 50000 个节点。
每个节点的值在 [1, 100] 之间。

实现思路

实现最长交错路径(Longest ZigZag Path)的问题涉及在二叉树中找到一条路径,该路径上的每一步都在左右子树之间交替。具体来说,路径从根节点开始,每次选择左子节点或右子节点,但不能连续两次选择同一个方向。最长交错路径的长度是这条路径上边的数量。

代码详解

  1. 定义数据结构
    首先,定义一个二叉树节点的类,用于表示树中的每个节点。
class TreeNode:
    def __init__(self, value=0, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right
  1. 初始化类和变量
    在解决方案类中,定义一个变量来记录最长交错路径的长度,并初始化该类。
class Solution:
    def __init__(self):
        self.max_length = 0
  1. 定义递归函数
    使用深度优先搜索(DFS)来遍历二叉树。在每个节点,记录当前路径的长度,并更新最长交错路径的长度。定义递归函数 dfs 来处理这个过程。
def dfs(node, direction, length):
    if not node:
        return
    self.max_length = max(self.max_length, length)
    if direction == 'left':
        dfs(node.left, 'left', 1)  # 重置左边路径长度
        dfs(node.right, 'right', length + 1)  # 继续增加右边路径长度
    else:
        dfs(node.left, 'left', length + 1)  # 继续增加左边路径长度
        dfs(node.right, 'right', 1)  # 重置右边路径长度
  1. 调用递归函数
    在主函数 longestZigZag 中,从根节点开始,以左和右两个方向调用递归函数 dfs。
def longestZigZag(self, root: TreeNode) -> int:
    dfs(root, 'left', 0)
    dfs(root, 'right', 0)
    return self.max_length
  1. 将上述步骤组合成完整的代码:
class TreeNode:
    def __init__(self, value=0, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

class Solution:
    def __init__(self):
        self.max_length = 0

    def longestZigZag(self, root: TreeNode) -> int:
        def dfs(node, direction, length):
            if not node:
                return
            self.max_length = max(self.max_length, length)
            if direction == 'left':
                dfs(node.left, 'left', 1)  # 重置左边路径长度
                dfs(node.right, 'right', length + 1)  # 继续增加右边路径长度
            else:
                dfs(node.left, 'left', length + 1)  # 继续增加左边路径长度
                dfs(node.right, 'right', 1)  # 重置右边路径长度

        dfs(root, 'left', 0)
        dfs(root, 'right', 0)
        return self.max_length

# 示例二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.right = TreeNode(4)
root.left.right.left = TreeNode(5)
root.left.right.right = TreeNode(6)

# 计算最长交错路径
solution = Solution()
result = solution.longestZigZag(root)
print("最长交错路径长度:", result)

关键点总结
二叉树节点类:用于表示树的结构。
深度优先搜索(DFS):用于遍历二叉树。
递归:在每个节点记录路径的长度,并更新最长交错路径的长度。
方向标志:用 direction 参数来指示当前路径的方向(左或右),并在递归调用时进行交替。
路径长度记录:用 length 参数来记录当前路径的长度,并更新 self.max_length 以记录最长路径的长度。
通过这些步骤,可以有效地计算出二叉树中最长的交错路径。

GO语言实现

package main

import "fmt"

// TreeNode 表示二叉树的节点
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

// Solution 结构体用于记录最长交错路径的长度
type Solution struct {
    maxLength int
}

// NewSolution 初始化 Solution
func NewSolution() *Solution {
    return &Solution{maxLength: 0}
}

// dfs 递归函数遍历二叉树
func (s *Solution) dfs(node *TreeNode, direction string, length int) {
    if node == nil {
        return
    }

    // 更新最长路径长度
    if length > s.maxLength {
        s.maxLength = length
    }

    if direction == "left" {
        s.dfs(node.Left, "left", 1)         // 重置左边路径长度
        s.dfs(node.Right, "right", length+1) // 继续增加右边路径长度
    } else {
        s.dfs(node.Left, "left", length+1)  // 继续增加左边路径长度
        s.dfs(node.Right, "right", 1)       // 重置右边路径长度
    }
}

// LongestZigZag 计算二叉树的最长交错路径
func (s *Solution) LongestZigZag(root *TreeNode) int {
    s.dfs(root, "left", 0)
    s.dfs(root, "right", 0)
    return s.maxLength
}

func main() {
    // 构建示例二叉树
    root := &TreeNode{Val: 1}
    root.Left = &TreeNode{Val: 2}
    root.Right = &TreeNode{Val: 3}
    root.Left.Right = &TreeNode{Val: 4}
    root.Left.Right.Left = &TreeNode{Val: 5}
    root.Left.Right.Right = &TreeNode{Val: 6}

    // 计算最长交错路径
    solution := NewSolution()
    result := solution.LongestZigZag(root)
    fmt.Println("最长交错路径长度:", result)
}

kotlin实现

class TreeNode(val value: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null
}

class Solution {
    private var maxLength = 0

    private fun dfs(node: TreeNode?, direction: String, length: Int) {
        if (node == null) return

        // 更新最长路径长度
        if (length > maxLength) {
            maxLength = length
        }

        if (direction == "left") {
            dfs(node.left, "left", 1)       // 重置左边路径长度
            dfs(node.right, "right", length + 1) // 继续增加右边路径长度
        } else {
            dfs(node.left, "left", length + 1)  // 继续增加左边路径长度
            dfs(node.right, "right", 1)     // 重置右边路径长度
        }
    }

    fun longestZigZag(root: TreeNode?): Int {
        dfs(root, "left", 0)
        dfs(root, "right", 0)
        return maxLength
    }
}

fun main() {
    // 构建示例二叉树
    val root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left?.right = TreeNode(4)
    root.left?.right?.left = TreeNode(5)
    root.left?.right?.right = TreeNode(6)

    // 计算最长交错路径
    val solution = Solution()
    val result = solution.longestZigZag(root)
    println("最长交错路径长度: $result")
}

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

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

相关文章

盘点AI做自媒体五条赚钱路径,新手小白必看(附教程)

前言 盘点用AI做自媒体赚钱的五条路径,只要学会使用AI工具,你也可以马上赚到钱。 我认为短视频是趋势,但相比于短视频而言,AI则是未来更大的趋势。 AI现在才属于萌芽期,好比是98年的互联网和07年的移动互联网&#x…

Jmeter使用JSON Extractor提取多个变量

1.当正则不好使时,用json extractor 2.提取多个值时,默认值必填,否则读不到变量

Linux - Shell 以及 权限问题

目录 Shell的运行原理 Linux权限问题 Linux权限的概念 如何实现用户账号之间的切换 如何仅提升当前指令的权限 如何将普通用户添加到信任列表 Linux权限管理 文件访问者的分类(人) 文件类型和访问权限(事物属性) 文件权限值的表…

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——模型部分浅析(1)

【GeoTransformer系列】——模型部分 1. create_model2. model的本质3. 模型的主要结构3.1 backbone3.2 transformer本篇继续对GeoTransformer/experiments/geotransformer.kitti.stage5.gse.k3.max.oacl.stage2.sinkhorn/下面的trainval.py进行详细的解读,主要是模型部分, 可以…

一款针对Webpack等前端打包工具所构造的网站进行快速、高效安全检测的扫描工具

免责声明 由于传播、利用本公众号夜组安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号夜组安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除…

硅纪元视角 | 法国8人团队发布Moshi,挑战OpenAI的开源实时多模态模型!

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

51单片机-让一个LED灯闪烁、流水灯(涉及:自定义单片机的延迟时间)

目录 设置单片机的延迟(睡眠)函数查看单片机的时钟频率设置系统频率、定时长度、指令集 完整代码生成HEX文件下载HEX文件到单片机流水灯代码 (自定义延迟时间) 设置单片机的延迟(睡眠)函数 查看单片机的时钟频率 检测前单片机必…

红海云签约海新域集团,产业服务运营领军企业加速人力资源数字化转型

北京海新域城市更新集团有限公司(以下简称“海新域集团”)是北京市海淀国有资产投资集团有限公司一级监管企业,致力于成为国内领先的产业服务运营商。集团积极探索城市和产业升级新模式,通过对老旧、低效等空间载体重新定位规划、…

【Python】成功解决TypeError: iteration over a 0-d tensor

【🐍Python】成功解决TypeError: iteration over a 0-d tensor 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介&#xf…

赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!

简介 websocket在前端开发中,是一个必须掌握的技术!你可以不用,但必须掌握! 前几天,就遇到这样一个需求,要求界面的数据通过websocket实时推送,并且必须支持断网重连、自动心跳! 自动心跳是定期向服务端发送小型数据包,如果一段时间内服务端没有收到心跳响应,系统可…

大模型LLMs概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题:Large Language Models for Generative Information Extraction: A Survey 论文链接:https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型(LLMs)在生成式信息抽取(IE)任务中的应用…

1.1.2数据结构的三要素

一.数据结构的三要素 数据结构这门课着重关注的是数据元素之间的关系,和对这些数据元素的操作,而不关心具体的数据项内容 。 1.逻辑结构 (1)集合结构 (2)线性结构 数据元素之间是一对一的关系。除了第一个…

【C语言】return 关键字

在C语言中,return是一个关键字,用于从函数中返回值或者结束函数的执行。它是函数的重要组成部分,负责将函数的计算结果返回给调用者,并可以提前终止函数的执行。 主要用途和原理: 返回值给调用者: 当函数执…

AI绘画Stable Diffusion画全身图总是人脸扭曲?ADetailer插件实现一键解决!

大家好,我是向阳 你是否遇到过SD生成的人物脸部扭曲、甚至令人恶心的情况?也曾感到束手无策?别担心,这份教程专为你而来。 在使用SD生成人物全身照时,你可能经常发现人物的脸部会出现扭曲问题。这是因为人物面部像素…

TP8/6 更改后台入口地址admin改为myadmin 隐藏真实后台网址

原来www.xxx.com/admin 改后www.xxx.com/myadmin config/app.php // 应用映射(自动多应用模式有效)app_map > [admintest>admin], 官方文档:ThinkPHP官方手册

免费申请 HTTPS 证书的八大方法

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 为了保证网站的安全和数据的隐私性,使用 HTTPS 加密协议已成为必需。HTTPS 证书由受信任的证书颁发机构 (CA) 签发,可以加密客户端和服务器之间的通信。 幸运的是,有许多方法可以免费申请 HTTPS 证书。本文将介绍八种方法…

云仓酒庄天津分公司:深化业务常态化运营

标题:云仓酒庄天津分公司:深化业务常态化运营,以沙龙为纽带,构建价值叠加的酒业新生态 在当今复杂多变的经济环境中,传统酒业面临着前所未有的挑战与机遇。随着数字化转型的加速和消费者偏好的日益多元化,…

springcloud+vue项目,controller层接口返回json数据,前端可以接收到数据,但浏览器“F12-->网络-->响应“显示为空的问题处理

1.显示为空的场景 SharetekR(access_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJQQzoxODA1ODA4ODc1MjUwMTIyNzUyIiwicm5TdHIiOiJrZEoxV05CV3NBSUdYb05TbktSU3kzOGNuSnk3c3FRTSIsInVzZXJJZCI6MTgwNTgwODg3NTI1MDEyMjc1MiwidXNlck5h…

【Python】九种数据类型详讲(内含常见常见的字符串函数汇总)

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言Number(数字)整数类型int (整型,长整型)float(浮点型)complex(复数)…

从硬件角度看Linux的内存管理

1. 分页机制 分段机制的地址映射颗粒度太大,以整个进程地址空间为单位的分配方式导致内存利用率不高。 分页机制把这个分配机制的单位继续细化为固定大小的页(Page),进程的虚拟地址空间也按照页来分割,这样常用的数据和代码就可以以页为单位…