【散刷】二叉樹基礎OJ題(三)

📝前言說明:
本專欄主要記錄本人的基礎算法學習以及刷題記錄,使用語言為C++。
每道題我會給出LeetCode上的題號(如果有題號),題目,以及最后通過的代碼。沒有題號的題目大多來自牛客網。對于題目的講解,主要是個人見解,如有不正確,歡迎指正,一起進步!

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C++學習筆記,C語言入門基礎,python入門基礎,python刷題專欄,Linux
🎀CSDN主頁 愚潤澤

題目

  • LCR 155. 將二叉搜索樹轉化為排序的雙向鏈表
  • 105. 從前序與中序遍歷序列構造二叉樹
  • 106. 從中序與后序遍歷序列構造二叉樹
  • 144. 二叉樹的前序遍歷
  • 94. 二叉樹的中序遍歷
  • 145. 二叉樹的后序遍歷

LCR 155. 將二叉搜索樹轉化為排序的雙向鏈表

題目鏈接:https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/description/
在這里插入圖片描述

  • 中序遍歷,得到的序列是有序的
  • 記錄當前節點的前一個節點 prev
  • cur -> left = prev
  • 但是 cur -> right 要指向 nxt(下一個節點)
  • 我們可以讓 cur 當上一層的下一個節點,然后讓:pre -> right = cur
class Solution {
public:void dfs(Node* cur, Node* &prev) // 必須要按引用傳遞,要是全局的{if(!cur) return;dfs(cur->left, prev);cur->left = prev;if(prev)prev->right = cur;prev = cur;dfs(cur->right, prev);}Node* treeToDoublyList(Node* root) {if(root == nullptr) return nullptr;Node* prev = nullptr;dfs(root, prev);Node* tail = prev; // 遍歷完 prev 就是尾節點,nullptr 是最后一個節點退出// 找到頭節點(最左節點)Node* head = root;while (head->left) {head = head->left;}head->left = tail;tail->right = head;return head;}
};

105. 從前序與中序遍歷序列構造二叉樹

題目鏈接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/
在這里插入圖片描述

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {// 通過前序確定根,然后找到中序根的位置,可以劃分數的左右子樹// 然后再對左右子樹用同樣的方法,得到構建好的左右子樹// 遞歸時,子樹的 preorder 和 inorder 的區間會改變)if(preorder.empty()) return nullptr;// 左子樹的中序遍歷序列的元素個數(同時也是先序遍歷的, 因為左子樹遍歷完了才會遍歷右子樹)int left_size = ranges::find(inorder, preorder[0]) - inorder.begin();// 構造左子樹的 preorder 和 inordervector<int> l_pre(preorder.begin() + 1, preorder.begin() + 1 + left_size);vector<int> l_ino(inorder.begin(), inorder.begin() + left_size);// 構造右子樹的vector<int> r_pre(preorder.begin() + 1 + left_size, preorder.end());vector<int> r_ino(inorder.begin() + left_size + 1, inorder.end());TreeNode* left = buildTree(l_pre, l_ino); // 相信你把左子樹構建好了TreeNode* right = buildTree(r_pre, r_ino);return new TreeNode(preorder[0], left, right); // 用當前的根節點 + 構建好的左右子樹}
};
  • 注意好迭代器的起始和結束位置的選擇(迭代器構造是左閉右開),注意要跳過根節點

106. 從中序與后序遍歷序列構造二叉樹

題目鏈接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/
在這里插入圖片描述

class Solution {
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int n = postorder.size();if(!n) return nullptr;int l_size = ranges::find(inorder, postorder[n - 1]) - inorder.begin();vector<int> l_pos(postorder.begin(), postorder.begin() + l_size);vector<int> l_ino(inorder.begin(), inorder.begin() + l_size);vector<int> r_pos(postorder.begin() + l_size, postorder.end() - 1);vector<int> r_ino(inorder.begin() + l_size + 1, inorder.end());TreeNode* left = buildTree(l_ino, l_pos);TreeNode* right = buildTree(r_ino, r_pos);return new TreeNode(postorder[n - 1], left, right);}
};

144. 二叉樹的前序遍歷

題目鏈接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
在這里插入圖片描述

class Solution {
public:vector<int> ans;void dfs(TreeNode* root){if(!root) return;ans.push_back(root->val);dfs(root->left);dfs(root->right);}vector<int> preorderTraversal(TreeNode* root) {dfs(root);return ans;}
};

94. 二叉樹的中序遍歷

題目鏈接:https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
在這里插入圖片描述

class Solution {
public:vector<int> ans;void dfs(TreeNode* root){if(!root) return;dfs(root->left);ans.push_back(root->val);dfs(root->right);}vector<int> inorderTraversal(TreeNode* root) {dfs(root);return ans;}
};

145. 二叉樹的后序遍歷

題目鏈接:https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
在這里插入圖片描述

class Solution {
public:vector<int> ans;void dfs(TreeNode* root){if(!root) return;dfs(root->left);dfs(root->right);ans.push_back(root->val);}vector<int> postorderTraversal(TreeNode* root) {dfs(root);return ans;}
};

🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

什么是數據交換?有哪些數據交換方式?

目錄 一、數據交換是什么 二、數據交換面臨的挑戰 1. 數據格式差異 2. 數據標準不統一 3. 安全與隱私問題 4. 網絡與性能問題 三、常見的數據交換方式 1. 文件交換 2. 數據庫直連 3. 中間件交換 4. API接口交換 四、數據交換的發展趨勢 1. 實時性要求提高 2. 標準…

C#winform畫圖代碼記錄

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 坐標變換 {public partial class Fo…

python打卡day50

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np# 定義通道注意力 class ChannelAttention(nn.Module):def __i…

Go語言多線程問題

打印零與奇偶數&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥鎖和條件變量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…

ateⅹⅰt()的用法

在C/C++中, atexit() 函數用于注冊程序退出時需要調用的函數,即使程序通過 main() 函數返回、 exit() 函數退出或異常終止,這些注冊的函數也會被執行。以下是其詳細用法: 1. 函數原型與頭文件 #include <cstdlib> // C++中需包含此頭文件 int atexit(void (*functio…

【大模型】 使用llama.cpp 進行模型轉換和量化

目錄 1 相關知識 ■llama.cpp ■GGUF 格式 ■量化 2 詳細步驟 克隆 llama.cpp 倉庫 安裝依賴 配置 CMake 構建 構建項目 驗證安裝 轉換 safetensors 為 FP16 GGUF 量化模型 (Q4_K_M) 測試量化模型 1 相關知識 ■llama.cpp llama.cpp是一個開源的 C/C++ 庫,旨…

大數據學習(133)-Hive數據分析2

????&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4…

IDEA 連接 Docker 一鍵打鏡像

首先&#xff0c;檢查 IDEA 是否安裝了 Docker 插件&#xff1a; 版本比較新的 IDEA 默認都安裝了這個插件&#xff0c;如果沒有安裝&#xff0c;安裝一下。 確保我們虛擬機上安裝了 Docker 和 Docker-compose&#xff0c;并啟動了 Docker。 找到 IDEA 下方的 Services tab 欄…

第六講——一元函數微分學的應用之中值定理、微分等式與微分不等式

文章目錄 連續函數性質定理定理1 有界與最值定理定理2 介值定理定理3 平均值定理定理4 零點定理定理5 費馬定理導數介值定理(達布定理) 中值定理羅爾定理拉格朗日中值定理柯西中值定理泰勒公式 討論方程的根問題——微分等式證明不等式問題使用函數的性質(單調性、凹凸性、最值…

2025.06.11【Ribo-seq】|用CPAT預測sORF序列的編碼潛能

文章目錄 前言一、準備工作1. 安裝CPAT2. 下載物種特異性模型 二、準備sORF核酸序列1. 獲取sORF的拼接核酸序列示例腳本&#xff08;假設已獲得外顯子fasta&#xff09;&#xff1a; 三、運行CPAT預測編碼潛能1. 準備CPAT模型和hexamer表2. 運行CPAT 四、結果解讀五、常見問題與…

Hive面試題匯總

一、hive架構相關 遇到這類問題&#xff0c;可以靈活的去回答&#xff0c;比如可以結合平時使用hive的經驗作答&#xff0c;也可以結合下圖從數據的讀入、解析、元數據的管理&#xff0c;數據的存儲等角度回答&#xff1a; 二、hive的特點 本題主要為了考察對hive的整體使用…

樹莓派超全系列教程文檔--(57)如何設置 Apache web 服務器

如何設置 Apache web 服務器 設置 Apache web 服務器安裝 Apache測試 web 服務器更改默認網頁 為 Apache 安裝 PHP 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 設置 Apache web 服務器 Apache 是一款流行的 web 服務器應用程序&#xff0c;您…

(九)現代循環神經網絡(RNN):從注意力增強到神經架構搜索的深度學習演進

現代循環神經網絡的內容&#xff0c;將介紹幾種先進的循環神經網絡架構&#xff0c;包括門控循環單元&#xff08;GRU&#xff09;、長短期記憶網絡&#xff08;LSTM&#xff09;的變體&#xff0c;以及注意力機制等。這些內容將幫助你更深入地理解循環神經網絡的發展和應用。 …

牛市與熊市:市場周期的雙面鏡

牛市推動資產增值與風險積累&#xff0c;熊市擠壓泡沫并孕育機會&#xff0c;兩者交替循環&#xff0c;構成市場自我調節機制。 1、概念對比&#xff1a;情緒與趨勢的博弈 牛市&#xff08;Bull Market&#xff09;&#xff1a;指資產價格持續上漲&#xff08;通常漲幅超20%&a…

web程序設計期末復習-填空題

常用標簽 塊級標記 行內標記等 一、塊級元素 特點&#xff1a; 獨占一行可以設置寬度、高度、內外邊距默認情況下會從上到下垂直排列 常見標簽&#xff1a; 標簽 含義 <div> 最常用的通用塊級容器 <p> 段落 <h1>到<h6> 標題&#xff08;一級…

go全局配置redis,全局只需要連接一次,然后全局可以引用使用

創建redis文件夾、創建dadeRedis.go package redisimport ("context""github.com/go-redis/redis/v8""log""time" )var (client *redis.Clientctx context.Background() )// 初始化Redis連接&#xff08;建議在程序啟動時調用&am…

緩沖區(C語言緩沖區+內核緩沖區)一個例子解釋他們的關系和作用!!!

首先提出問題&#xff1a; 為什么以下代碼是先sleep三秒后&#xff0c;屏幕才顯示"XXXXXXX"。 #include<stdio.h> #include<unistd.h>int main() {printf("XXXXXXX");sleep(3);return 0; } 為什么以下代碼是先顯示"XXXXXXX"&#xf…

【2025版】Java 工程師學習路線圖 —— 掌握程度描述版

?【2025版】Java 工程師學習路線圖 &#x1f4a1; 目標&#xff1a;成為合格的 Java 工程師&#xff08;前后端都要會&#xff09; &#x1f4dd; 結構清晰 | 階段明確 | 掌握程度分級 | 適合自學或轉行 &#x1f539; 階段一&#xff1a;編程基礎 計算機通識 模塊內容推薦掌…

從零實現一個紅隊智能體

從零實現一個紅隊智能體(持續更新) 2025-06-09 背景&#xff1a;最近學了基礎些東西和工具基礎使用&#xff0c;發現一套流程下來太多需要手工要做的&#xff0c;就像自己能不能結合自己的技術棧實現小工具 &#x1f947; 第一步&#xff1a;從實用性開始分析 目標場景 希望…

Uniapp實現多選下拉框

文章目錄 前言一、效果展示1.1 下拉效果圖1.2 下拉選擇效果圖1.3 選擇顯示效果圖 二、組件源碼2.1.CustomCheckbox.vue源碼2.2.niceui-popup-select.vue源碼 三、demo.vue代碼演示 前言 之前在使用Uniapp時&#xff0c;一直都是下拉框單選。今天某個項目需求需要使用Uniapp實現…