2025高頻面試算法總結篇【二叉樹】

文章目錄

  • 直接刷題鏈接直達
  • 非遞歸實現求二叉樹的深度
  • 非遞歸從左至右打印一顆二叉樹中的所有路徑
  • 判斷平衡二叉樹
  • 二叉搜索樹中第K小的元素
  • 二叉樹的完全性檢驗
  • 根據前&中序遍歷結果重建二叉樹
  • 二叉樹的最近公共祖先
  • 二叉樹的直徑
  • 二叉樹的遍歷


直接刷題鏈接直達

  • 非遞歸實現求二叉樹的深度
    • 引入隊列,統計當前層次節點數目,逐層遍歷
    • 二叉樹的深度(遞歸和非遞歸)
    • 102. 二叉樹的層次遍歷
  • 非遞歸從左至右打印一顆二叉樹中的所有路徑
    • 257. 二叉樹的所有路徑
  • 判斷平衡二叉樹
    • 110. 平衡二叉樹
  • 尋找二叉搜索樹中第一個大于k的節點
    • 中序遍歷求值
    • 類似于 230. 二叉搜索樹中第K小的元素
  • 二叉樹的完全性檢驗
    • 958. 二叉樹的完全性檢驗
  • 根據前&中序遍歷結果重建二叉樹
    • 首先找到根節點,再劃分左右子樹區域,逐層遞歸找到左右子節點
    • 105. 從前序與中序遍歷序列構造二叉樹
  • 實現一個二叉搜索樹迭代器,包括 next() hasNext() 方法(PayPal)
    • 173. 二叉搜索樹迭代器
  • 二叉樹的右視圖(Shopee)
    • 199. 二叉樹的右視圖
  • 給定一個二叉樹根節點和指定路徑,判斷二叉樹中是否存在給定指定路徑,且要求指定路徑最后一個元素為葉節點
  • 將一顆二叉搜索樹轉化成一個排序的雙向鏈表
    • 不能創建新結點
    • 二叉搜索樹與雙向鏈表
  • 二叉樹的最近公共祖先
    • 首先判斷當前節點是否為指定結點,是則返回
    • 遞歸當前結點的左右子樹
    • 如果兩邊均不為null,表示找到,返回當前結點,均為null則返回null,否則返回對應子節點(left / right)
    • 236. 二叉樹的最近公共祖先
    • Lowest Common Ancestor Binary Tree(各種情況詳細舉例,推薦)
  • 二叉樹的中序遍歷的下一個結點
    • 先判斷右子結點不為空,返回右子節點最左邊的節點
    • 若父節點不為空,上溯到根節點的 “/”即返回
    • 二叉樹的下一個結點
  • 紅黑樹描述及其復雜度分析(插入/查找)
    • 查找、插入、刪除時間復雜度 --> O(logN)
    • 紅黑樹 Wiki
    • 26 | 紅黑樹(下):掌握這些技巧,你也可以實現一個紅黑樹 (紅黑樹分析)
  • 二叉樹的直徑
    • 543. 二叉樹的直徑
  • 二叉樹的遍歷
    • 二叉樹的前序遍歷 / 二叉樹的中序遍歷 / 二叉樹的后序遍歷

非遞歸實現求二叉樹的深度

題目: 給定一個二叉樹 root ,返回其最大深度。
二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。

遞歸:

class Solution {public int maxDepth(TreeNode root) {if (root == null) return 0;int left = maxDepth(root.left);int right = maxDepth(root.right);return (left > right ? left:right) +1;}
}

非遞歸:
引入隊列,統計當前層次節點數目,逐層遍歷

class Solution {public int maxDepth(TreeNode root) {if (root == null) return 0;Queue<TreeNode> q = new LinkedList<>();q.offer(root);int depth = 0;while (!q.isEmpty()) {depth++;int total = q.size(); // 統計這層的數量=》全部出隊列,然后他們的子節點入隊while (total-- > 0) {TreeNode temp = q.poll();if (temp.left != null) {q.offer(temp.left);}if (temp.right != null) {q.offer(temp.right);}}}return depth;}
}

非遞歸從左至右打印一顆二叉樹中的所有路徑

題目: 給你一個二叉樹的根節點 root ,按 任意順序 ,返回所有從根節點到葉子節點的路徑。

遞歸:

class Solution {public List<String> binaryTreePaths(TreeNode root) {treePath(root, "");return res;}List<String> res = new ArrayList<>();public void treePath(TreeNode root, String path) {if (root == null) {return;}// 葉子節點if (root.left == null && root.right == null) {res.add(path+root.val);return;}treePath(root.left, path+root.val+"->");treePath(root.right, path+root.val+"->");}
}

非遞歸:

class Solution {// 257. 二叉樹的所有路徑public List<String> binaryTreePaths(TreeNode root) {List<String> res = new LinkedList<>();if (root == null) return res;// 存放 節點Stack<TreeNode> nodeStack = new Stack<>();// 存放 pathStack<String> pathStack = new Stack<>();// 根節點 入棧nodeStack.push(root);pathStack.push(root.val + "");while (!nodeStack.isEmpty()) {TreeNode node = nodeStack.pop();String path = pathStack.pop();if (node.left == null && node.right == null) {res.add(path);}if (node.right != null) {pathStack.push(path + "->" + node.right.val);nodeStack.push(node.right);}if (node.left != null) {pathStack.push(path + "->" + node.left.val);nodeStack.push(node.left);}}return res;}
}

判斷平衡二叉樹

題目:給定一個二叉樹,判斷它是否是 平衡二叉樹

class Solution {public boolean isBalanced(TreeNode root) {if (root == null) return true;if(Math.abs(findDepth(root.left)-findDepth(root.right)) > 1) return false;return isBalanced(root.left) && isBalanced(root.right);}public int findDepth(TreeNode root) {if (root == null) return 0;int left = findDepth(root.left);int right = findDepth(root.right);return (left > right ? left:right)+1;}
}

二叉搜索樹中第K小的元素

題目: 給定一個二叉搜索樹的根節點 root ,和一個整數 k ,請你設計一個算法查找其中第 k 小的元素(從 1 開始計數)。

class Solution {List<Integer> list;public int kthSmallest(TreeNode root, int k) {list = new ArrayList<>();inOrder(root);return list.get(k-1);}public void inOrder(TreeNode root) {if (root == null) return;inOrder(root.left);list.add(root.val);inOrder(root.right);}}

二叉樹的完全性檢驗

題目: 給你一棵二叉樹的根節點 root ,請你判斷這棵樹是否是一棵 完全二叉樹 。

對于一個完全二叉樹,層序遍歷的過程中遇到第一個空節點之后不應該再出現非空節點


class Solution {public boolean isCompleteTree(TreeNode root) {if (root == null) return true;// 層次遍歷Queue<TreeNode> q = new LinkedList<>();q.offer(root);boolean flag = false; // 開始出現 null 節點while(!q.isEmpty()) {TreeNode t = q.poll();if (flag && t != null) {return false;}if (t == null) {flag = true;}else {q.offer(t.left);q.offer(t.right);}}return true;}
}

根據前&中序遍歷結果重建二叉樹

題目:給定兩個整數數組 preorder 和 inorder ,其中 preorder 是二叉樹的先序遍歷, inorder 是同一棵樹的中序遍歷,請構造二叉樹并返回其根節點。

class Solution {private HashMap<Integer, Integer> inorderMap; // 存放中序值和索引private int preorderIndex = 0;// 當前訪問的前序的位置public TreeNode buildTree(int[] preorder, int[] inorder) {inorderMap = new HashMap<>();for (int i = 0; i < inorder.length; i++) {inorderMap.put(inorder[i], i);}return createTree(preorder, 0, inorder.length-1);}public TreeNode createTree(int[] preorder, int left, int right) {if (left > right) return null;int val = preorder[preorderIndex++];TreeNode root = new TreeNode(val);root.left = createTree(preorder, left, inorderMap.get(val)-1);root.right = createTree(preorder, inorderMap.get(val)+1, right);return root;}
}

二叉樹的最近公共祖先

題目: 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節點 p、q,最近公共祖先表示為一個節點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || p == root || q == root) return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if (left != null && right != null) return root;return left != null ? left:right;}
}

二叉樹的直徑

給你一棵二叉樹的根節點,返回該樹的 直徑 。

二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。

兩節點之間路徑的 長度 由它們之間邊數表示。

class Solution {// 543 二叉樹的直徑private int maxDiameter = 0;public int diameterOfBinaryTree(TreeNode root) {maxDepth(root); // 在計算深度的過程中更新最大直徑return maxDiameter;}// 計算樹的最大深度,同時更新最大直徑private int maxDepth(TreeNode node) {if (node == null) {return 0;}int left = maxDepth(node.left); // 左子樹深度int right = maxDepth(node.right); // 右子樹深度// 更新直徑:左子樹深度 + 右子樹深度maxDiameter = Math.max(maxDiameter, left + right);// 返回當前節點的深度return Math.max(left, right) + 1;}}

二叉樹的遍歷

前序遍歷:

class Solution {public List<Integer> preorderTraversal(TreeNode root) {preorder(root);return ans;}List<Integer> ans = new ArrayList<>();public void preorder(TreeNode root) {if (root == null) return;ans.add(root.val);preorder(root.left);preorder(root.right);}
}

中序遍歷:

class Solution {// 92 中序遍歷public List<Integer> inorderTraversal(TreeNode root) {inorder(root);return ans;}List<Integer> ans = new ArrayList<>();public void inorder(TreeNode root) {if (root == null) return;inorder(root.left);ans.add(root.val);inorder(root.right);}
}

后續遍歷:

class Solution {public List<Integer> postorderTraversal(TreeNode root) {postorder(root);return ans;}List<Integer> ans = new ArrayList<>();public void postorder(TreeNode root) {if (root == null) return;postorder(root.left);postorder(root.right);ans.add(root.val);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900565.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900565.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900565.shtml

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

相關文章

redis 和 MongoDB都可以存儲鍵值對,并且值可以是復雜json,用完整例子分別展示說明兩者在存儲json鍵值對上的使用對比

Redis 存儲 JSON 鍵值對示例 存儲操作&#xff1a; // 存儲用戶信息&#xff08;鍵&#xff1a;user:1001&#xff0c;值&#xff1a;JSON對象&#xff09; SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介紹幾種創意登錄頁(含完整源碼)

今天為大家收集了幾種不同風格的登錄頁&#xff0c;搭配動態漸變背景&#xff0c;效果絕對驚艷&#xff01; CSS3實現動態漸變玻璃擬態登錄頁 一、開篇語 純CSS實現當下最火的玻璃擬態(Morphism)風格登錄頁&#xff0c;搭配動態漸變背景&#xff0c;效果絕對驚艷&#xff01; …

R語言之mlr依賴包缺失警告之分析

因為本地沒有網絡&#xff0c;所有相關的依賴包都是手動下載&#xff0c;再使用腳本一鍵安裝的。 在使用mlr包時&#xff0c;執行下面的代碼時&#xff0c;總是報各種依賴缺失&#xff0c;也不知道咋看FAIL信息。 # 建模與調參 # 查閱線性回歸、隨機森林、xgboost和KNN四種模…

無狀態版的DHCPv6是不是SLAAC? 筆記250405

無狀態版的DHCPv6是不是SLAAC? 筆記250405 無狀態版 DHCPv6 不是 SLAAC&#xff0c;但二者在 IPv6 網絡中可協同工作。以下是核心區別與協作關系&#xff1a; 本質區別 特性SLAAC無狀態 DHCPv6主要功能生成 IPv6 地址&#xff08;基于路由器通告的前綴&#xff09;分發 DNS、…

uniapp微信小程序地圖marker自定義氣泡 customCallout偶爾顯示不全解決辦法

這個天坑問題&#xff0c;在微信開發工具上是不會顯示出來的,只有在真機上才會偶爾出現隨機樣式偏移/裁剪/寬長偏移&#xff0c;詢問社區也只是讓你提交代碼片段&#xff0c;并無解決辦法。 一開始我懷疑是地圖組件加載出現了問題&#xff0c;于是給地圖加了一個v-if"reL…

LabVIEW商業軟件開發注意問題

在 LabVIEW 商業軟件開發進程中&#xff0c;性能優化、界面設計及兼容性與擴展性&#xff0c;對軟件品質、用戶體驗和市場適配性起著決定性作用。下面&#xff0c;借助多個LabVIEW 編程特性的實際案例&#xff0c;深入分析這些方面的開發要點。 一、性能優化&#xff1a;提升軟…

Ubuntu 安裝 VLC

最近項目中需要用VLC查看NVR下子設備的RTSP流&#xff0c;特此記錄&#xff0c;便于日后查閱。 1、安裝snap $ sudo apt update $ sudo apt install snapd 2、安裝vlc $ sudo snap install vlc 3、可能遇到的問題 snap beta install on ubuntu 22.04 failing to start Qt: Se…

LeetCode 3047 求交集區域內的最大正方形面積

探尋矩形交集中的最大正方形面積 在算法與數據結構的探索之路上&#xff0c;二維平面幾何問題一直占據著獨特的地位&#xff0c;它們不僅考驗我們的空間思維能力&#xff0c;還要求我們能夠巧妙地運用算法邏輯。今天&#xff0c;我們將深入剖析一道極具代表性的二維平面幾何算…

【Kafka基礎】Kafka 2.8以下版本的安裝與配置指南:傳統ZooKeeper依賴版詳解

對于仍在使用Kafka 2.8之前版本的團隊來說&#xff0c;需要特別注意其強依賴外部ZooKeeper的特性。本文將完整演示傳統架構下的安裝流程&#xff0c;并對比新舊版本差異。 1 版本特性差異說明 1.1 2.8 vs 2.8-核心區別 特性 2.8版本 2.8-版本 協調服務 可選內置KRaft模式 …

springboot+easyexcel實現下載excels模板下拉選擇

定義下拉注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface ExcelDropDown {/*** 固定下拉選項*/String[] source() default {};/*** 動態數據源key&#xff08;從上下文中獲取&#xff09;*/String sourceMethod() default "";…

第15周:注意力匯聚:Nadaraya-Watson 核回歸

注意力匯聚&#xff1a;Nadaraya-Watson 核回歸 Nadaraya-Watson 核回歸是一個經典的注意力機制模型&#xff0c;它展示了如何通過注意力權重來對輸入數據進行加權平均。以下是該內容的核心總結&#xff1a; 關鍵概念 注意力機制框架&#xff1a;由查詢&#xff08;自主提示…

adb devices報錯 ADB server didn‘t ACK

ubuntu下連接手機首次使用adb devices 報錯ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…

Mac下Homebrew的安裝與使用

Mac下Homebrew的安裝與使用 一蓑煙羽 關注 2017.10.19 11:59* 字數 515 閱讀 7684評論 0喜歡 3 Homebrew簡介&#xff0c;安裝與使用 簡介 Homebrew 官方網站 Homebrew是一個包管理器&#xff0c;用于安裝Apple沒有預裝但你需要的UNIX工具。&#xff08;比如著名的wget&am…

非常適合做后臺項目的go腳手架

分享一個非常適合做后臺腳手架的go項目&#xff0c;該項目使用gin作為mvc框架搭建。她就是Gin-vue-admin。該一個基于 vue 和 gin 開發的全棧前后端分離的開發基礎平臺&#xff0c;集成jwt鑒權&#xff0c;動態路由&#xff0c;動態菜單&#xff0c;casbin鑒權&#xff0c;表單…

優化 Django 數據庫查詢

優化 Django 數據庫查詢 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 優化 Django 數據庫查詢**理解 N+1 查詢問題****`select_related`:外鍵的急加載**示例何時使用 `select_re…

大數據(5)Spark部署核彈級避坑指南:從高并發集群調優到源碼級安全加固(附萬億級日志分析實戰+智能運維巡檢系統)

目錄 背景一、Spark核心架構拆解1. 分布式計算五層模型 二、五步軍工級部署階段1&#xff1a;環境核彈級校驗階段2&#xff1a;集群拓撲構建階段3&#xff1a;黃金配置模板階段4&#xff1a;高可用啟停階段5&#xff1a;安全加固方案 三、萬億級日志分析實戰1. 案例背景&#x…

【學Rust寫CAD】36 顏色插值函數(alpha256.rs補充方法)

源碼 pub fn alpha_lerp(self,src: Argb, dst: Argb, clip: u32) -> Argb {self.alpha_mul_256(clip).lerp(src, dst)}這個函數 alpha_lerp 是一個顏色插值&#xff08;線性插值&#xff0c;lerp&#xff09;函數&#xff0c;它結合了透明度混合&#xff08;alpha_mul_256&…

解決Ubuntu系統鼠標不流暢的問題

電腦是聯想的臺式組裝機&#xff0c;安裝ubuntu系統&#xff08;不管是16、18、20、22&#xff09;后&#xff0c;鼠標都不流暢。最近幾天想解決這個問題&#xff0c;于是懷疑到了顯卡驅動上。懷疑之前一直用的是集成顯卡&#xff0c;而不是獨立顯卡&#xff0c;畢竟2060的顯卡…

oracle asm 相關命令和查詢視圖

有關asm磁盤的命令 添加磁盤 alter diskgroup data1 add disk /devices/diska*;---runs with a rebalance power of 5 , and dose not return until the rebalance operation is completealter diskgroup data1 add disk /devices/diskd* rebalance power 5 wait;查詢 select …

C++基于rapidjson的Json與結構體互相轉換

簡介 使用rapidjson庫進行封裝&#xff0c;實現了使用C對結構體數據和json字符串進行互相轉換的功能。最短只需要使用兩行代碼即可無痛完成結構體數據轉換為Json字符串。 支持std::string、數組、POD數據&#xff08;int,float,double等&#xff09;、std::vector、嵌套結構體…