leetcode--二叉樹中的最長交錯路徑

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 = valueself.left = leftself.right = right
  1. 初始化類和變量
    在解決方案類中,定義一個變量來記錄最長交錯路徑的長度,并初始化該類。
class Solution:def __init__(self):self.max_length = 0
  1. 定義遞歸函數
    使用深度優先搜索(DFS)來遍歷二叉樹。在每個節點,記錄當前路徑的長度,并更新最長交錯路徑的長度。定義遞歸函數 dfs 來處理這個過程。
def dfs(node, direction, length):if not node:returnself.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 = valueself.left = leftself.right = rightclass Solution:def __init__(self):self.max_length = 0def longestZigZag(self, root: TreeNode) -> int:def dfs(node, direction, length):if not node:returnself.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 mainimport "fmt"// TreeNode 表示二叉樹的節點
type TreeNode struct {Val   intLeft  *TreeNodeRight *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? = nullvar right: TreeNode? = null
}class Solution {private var maxLength = 0private 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.pswp.cn/web/39881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39881.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據開發中的數據生命周期管理

上班越久,發現有些數據一直放在那里,根本沒有流動,完全沒有發揮價值,數據是有生命周期的,而且生命周期管理得好,工作就會更輕松。 目錄 引言數據創建示例代碼 數據存儲示例代碼 數據使用示例代碼 數據維護示…

JavaScript中閉包的理解

閉包(Closure)概念:一個函數對周圍狀態的引用捆綁在一起,內層函數中訪問到其外層函數的作用域。簡單來說;閉包內層函數引用外層函數的變量,如下圖: 外層在使用一個函數包裹住閉包是對變量的保護&#xff0c…

學習python常用的英語單詞,有音標,有音節劃分,適合英語基礎差的人來入門

if [?f] 如果 else [els] 否則 while [wa?l] 當...的時候 for [f?:r] “對于”或“遍歷”,適合于 break [brek] 中斷 continue [k?nt?nju:] 繼續 con ti nue [k?n t? nju:] pass [pɑ:s] 通過 height [ha?t] 高度 weight [we?t] 重量 keyword [ki:w…

sping-10

什么是 bean 裝配 在Java中,bean裝配是一種將對象(也稱為bean)與其他對象之間建立關聯關系的方法。這種裝配可以通過手動編寫代碼來實現,也可以使用依賴注入框架(如Spring)來自動完成。 在bean裝配中&…

【計算機視覺系列實戰教程 (實戰02)】:基于特征點匹配的圖像配準

這里寫目錄標題 1、特征點提取(1)GFTT算法提取特征點A.What(什么是GFTT)B.GFTT的優勢C.How(如何使用GFTT算法提取圖像特征點) (2)FAST算法提取特征點A.What(什么是FAST角點)B.FAST角點的強度值C.How&#x…

每日Attention學習8——Rectangular self-Calibration Attention

模塊出處 [ECCV 24] [link] [code] Context-Guided Spatial Feature Reconstruction for Efficient Semantic Segmentation 模塊名稱 Rectangular self-Calibration Attention (RCA) 模塊作用 空間注意力 模塊結構 模塊代碼 import torch import torch.nn as nn import tor…

Ubuntu 22.04.1 LTS 離線安裝Docker

確定linux版本 cat /etc/lsb-release DISTRIB_IDUbuntuDISTRIB_RELEASE22.04DISTRIB_CODENAMEjammyDISTRIB_DESCRIPTION"Ubuntu 22.04.1 LTS"確定dpkg版本 sudo dpkg --print-architecture amd64下載地址 https://download.docker.com/linux/ubuntu/dists/jamm…

C++ | Leetcode C++題解之第216題組合總和III

題目&#xff1a; 題解&#xff1a; class Solution { private:vector<vector<int>> res;void backtracking(int k, int n, vector<int> ans){if(k 0 || n < 0){if(k 0 && n 0){res.emplace_back(ans);}return;}int start (ans.size() 0 ?…

深入解析Transformer中的多頭自注意力機制:原理與實現

深入解析Transformer中的多頭自注意力機制&#xff1a;原理與實現 Transformer模型自2017年由Vaswani等人提出以來&#xff0c;已經成為自然語言處理&#xff08;NLP&#xff09;領域的一個里程碑。其核心機制之一——多頭自注意力&#xff08;Multi-Head Attention&#xff0…

字節一年,人間三年

想來字節做研發&#xff0c;可以先看我這三年的體會和建議。 大家好&#xff0c;我是白露啊。 今天和大家分享一個真實的故事&#xff0c;是關于字節網友分享自己三年的工作經歷和感受。 由于白露也曾在字節待過兩年&#xff0c;可以說&#xff0c;說的都對。 你有沒有想過來…

javascript url 傳遞參數中文亂碼問題解決方案

在 JavaScript 中&#xff0c;傳遞 URL 參數時&#xff0c;如果參數包含中文字符&#xff0c;可能會出現亂碼問題。解決這一問題可以使用 encodeURIComponent 和 decodeURIComponent 函數。這些函數會對 URL 參數進行編碼和解碼&#xff0c;確保特殊字符&#xff08;包括中文字…

填報高考志愿,怎樣正確地選擇大學專業?

大學專業的選擇&#xff0c;會關系到未來幾年甚至一輩子的發展方向。這也是為什么很多人結束高考之后就開始愁眉苦臉&#xff0c;因為他們不知道應該如何選擇大學專業&#xff0c;生怕一個錯誤的決定會影響自己一生。 毋庸置疑&#xff0c;在面對這種選擇的時候&#xff0c;我…

全網最簡單的Java設計模式【三】工廠方法模式詳解

Java工廠方法模式詳解 一、概念介紹 1. 什么是工廠方法模式&#xff1f; 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;它允許定義一個接口或抽象類來創建對象&#xff0c;但將實際對象的實例化延遲到子類中實現。工廠方法模…

mybatis mapper.xml 比較運算符(大于|小于|等于)的寫法: 轉義和<![CDATA[]]>

文章目錄 引言I 使用xml 原生轉義的方式進行轉義II 使用 <![CDATA[ 內容 ]]>引言 應用場景:查詢時間范圍 背景:在 *.xml 中使用常規的 < > = <= >= 會與xml的語法存在沖突 <![CDATA[]]> 比 轉義符 來的繁瑣 <![CDATA[]]> 表示xml解析器忽略…

c++ 聯合(Union)的特性和使用

聯合&#xff08;Union&#xff09;是一種特殊的數據結構&#xff0c;允許在同一內存位置存儲不同的數據類型。一個 union 可以有多個數據成員&#xff0c;但是在任意時刻只有一個數據成員可以有值。當某個成員被賦值后其他成員變為未定義狀態。以下是聯合的主要特點和使用方式…

工程安全監測儀器振弦采集儀提升工程質量和安全水平

工程安全監測儀器振弦采集儀提升工程質量和安全水平 振弦采集儀是一種重要的工程安全監測儀器&#xff0c;可以用來監測建筑物、橋梁、隧道等工程結構的振動情況。它通過測量結構物的振動頻率和振幅&#xff0c;可以提供關鍵的數據用于評估結構的安全性和穩定性。振弦采集儀在…

無法解析的外部符號 _imp_XXX

問題解決&#xff1a;無法解析的外部符號 _imp_XXXXXXXXX-CSDN博客 解決方法 1. 打開網站&#xff0c;搜索相關函數&#xff0c;找到其關聯庫lib 2. 程序指定鏈接到庫。注意該語法是msvc編譯器特有特性。 #pragma comment(lib, "xxxx.lib")

【項目實踐】貪吃蛇

一、游戲效果展示二、博客目標三、使用到的知識四、Win32 API 介紹 4.1 WIn32 API4.2 控制臺程序4.3 控制屏幕上的坐標COORD4.4 GetStdHandle4.5 GetConsoleCursorInfo 4.5.1 CONSOLE_CURSOR_INFO 4.6 SetConsoleCursorInfo4.7 SetConsoleCursorPosition4.8 GetAsyncKeyState 五…

秋招突擊——7/4——復習{}——新作{最長公共子序列、編輯距離}

文章目錄 引言復習新作1143-最長公共子序列個人實現 參考實現編輯距離個人實現參考實現 貪心——買股票的最佳時機個人實現參考實現 貪心——55-跳躍游戲個人實現參考做法 總結 引言 昨天主要是面試&#xff0c;然后剩下的時間都是用來對面試中不會的東西進行查漏補缺&#xff…

dolphinscheduler-筆記2

springboot集成dolphinscheduler 說明 為了避免對DolphinScheduler產生過度依賴&#xff0c;實踐中通常不會全面采用其內置的所有任務節點類型。相反&#xff0c;會選擇性地利用DolphinScheduler的HTTP任務節點功能&#xff0c;以此作為工作流執行管理的橋梁&#xff0c;對接…