【算法學習之路】10.二叉樹

二叉樹

  • 前言
  • 一.簡介
  • 二.題目
    • 1
    • 2
    • 3

前言

我會將一些常用的算法以及對應的題單給寫完,形成一套完整的算法體系,以及大量的各個難度的題目,目前算法也寫了幾篇,題單正在更新,其他的也會陸陸續續的更新,希望大家點贊收藏我會盡快更新的!!!

一.簡介

二叉樹的題目大多基于遞歸

f(root){//對以root為根的二叉樹做一些操作或判斷
//遞歸體
if(root??){}f(root->left);f(root->right);
}

注意:可能為空樹

二.題目

1

力扣LCR 145. 判斷對稱二叉樹
在這里插入圖片描述

1.一棵樹何時鏡像對稱?
—左子樹與右子樹鏡像對稱,那么這個樹是對稱的。

2.如何判斷左右子樹鏡像對稱?(下面 的 == 是鏡像對稱的意思)
—左右子樹的根節點相同
—左子樹的左子樹 == 右子樹的右子樹
—左子樹的右子樹==右子樹的左子樹

3.用兩個指針p q對稱的遞歸遍歷樹,進行比較即可。
初始化:p=root->l q=root->r
遞歸出口:p q都為空,return 1
p q有一個為空 return 0
遞歸條件:p==q
p->l ==q->r
p->r ==q->l
4.特殊情況:空樹 也滿足條件

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:
bool check(TreeNode* p,TreeNode* q){if(p == NULL && q == NULL){//兩個子樹為零則相同return 1;}if(p == NULL || q == NULL){//若只有一個子樹為空則不相同return 0;}return p->val == q->val && check(p->left,q->right) && check(p->right,q->left);//若當前和左右子樹相同返回true
}bool checkSymmetricTree(TreeNode* root) {if(root == NULL){return 1;}return check(root->left,root->right);}
};

2

力扣236. 二叉樹的最近公共祖先
在這里插入圖片描述
分析:根據p,q的分布情況判斷答案
根節點root。
1.如果p,q分別出現在root的左右子樹中,則root是答案
2.若p ,q同時出現在root的某一個子樹x中,則問題轉化為在x樹中找公共祖先(遞歸)

得到解題思路:遞歸,去找p,q的出現位置,并判斷答案。
遞歸函數f(root,p,q) :在以root為根的樹中找p,q。
1.roo == NULL,空樹,返回NULL
2.roo == p或者root==q,找到了一個,直接返回root。若另一個在root的子樹中,root是答案。若不在,則返回找到的這個結點。
3.root不為空,也不是p,q,,說明p,q在root的左右子樹中,則遞歸調用,分別去左右子樹中找。
l=f(root->left,p,q) r=f(root->right,p,q)
(1)若l,r全為空,返回空
(2)若l,r有一個為空,返回另一個。說明在另一個子樹中找到了p,q或者答案
(3)若l,r都不為空,說明p,q一邊一個,則root是答案,返回root

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == NULL){//如果根為空return NULL;}if(p == root || q == root){//如果有一個節點為根return root;}TreeNode* l = lowestCommonAncestor(root->left,p,q);//查找左子樹TreeNode* r = lowestCommonAncestor(root->right,p,q);//查找右子樹if(l == NULL && r == NULL){//如果未找到return NULL;}if(l != NULL && r != NULL){//左右樹都有return root;}if(l == NULL){//不在左子樹return r;}if(r == NULL){//不在右子樹return l;}return NULL;}
};

3

力扣226. 翻轉二叉樹
在這里插入圖片描述
如果根節點的左右子樹分別完成翻轉之后,
只需要交換左右子樹即可。

問題轉化為分別去翻轉左右子樹。----遞歸

遞歸出口:當前節點為 NULL時返 回

流程:先分別遞歸翻轉左右子樹,
返回上來之后 交換左右子樹

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root == NULL){//結束條件return NULL;}TreeNode* l = invertTree(root->left);//翻轉左樹TreeNode* r = invertTree(root->right);//翻轉右數//翻轉根root->right = l;root->left = r;return root;}
};

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

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

相關文章

AI軟件棧:推理框架(二)-Llama CPP1

Llama CPP的主要構造,GGUF和GGML為兩個主要部分,包括模型描述文件和模型參數存儲文件 文章目錄 GGUF構建圖讀取權重 GGUF llama.cpp 的作者 Georgi Gerganov 提出的新一代大模型描述文件 GPT-Generated Unified Format,繼承自GGML&#xff0…

CentOS 7 64 安裝 Docker

前言 在虛擬機中安裝 Docker 是一種常見的測試和開發環境搭建方式。通過在虛擬機上安裝 Docker,可以方便地創建和管理容器化應用,同時避免對宿主機系統造成影響。以下是在 CentOS 7 虛擬機中安裝 Docker 的詳細步驟。 1. 更新系統(可以不操作…

Flutter_學習記錄_video_player、chewie 播放視頻

1. video_player 視頻播放 插件地址:https://pub.dev/packages/video_player 添加插件 導入頭文件 import package:video_player/video_player.dart;Android配置(iOS不用配置) 修改這個文件:/android/app/src/main/AndroidMani…

VSCode通過SSH免密遠程登錄Windows服務器

系列 1.1 VSCode通過SSH遠程登錄Windows服務器 1.2 VSCode通過SSH免密遠程登錄Windows服務器 文章目錄 系列1 準備工作2 本地電腦配置2.1 生成密鑰2.2 VS Code配置密鑰 3. 服務端配置3.1 配置SSH服務器sshd_config3.2 復制公鑰3.3 配置權限(常見問題)3.…

強大的數據庫DevOps工具:NineData 社區版

本文作者司馬遼太杰, gzh:程序猿讀歷史 在業務快速變化與數據安全日益重要的今天,生產數據庫變更管理、版本控制、數據使用是數據庫領域的核心挑戰之一。傳統的解決方式往往采用郵件或即時通訊工具發起審批流程,再通過堡壘機直連數…

離線服務器ollama新增qwen2:0.5b模型

離線服務器ollama新增qwen2:0.5b模型 Dify集成ollama前面已經介紹過離線服務器CentOS使用的docker安裝的ollama,其中在ollama中已經安裝了deepseek-r1:1.5b。目前的需求是需要再安裝一個qwen2:0.5b的模型,那么如何安裝呢? 1.首先在有網的服…

淺談StarRocks數據庫簡介及應用

StarRocks是一款高性能的實時分析型數據庫,專為復雜的SQL查詢提供極高的性能,尤其適用于數據分析場景。它是一款開源的新一代極速全場景MPP(Massively Parallel Processing,大規模并行處理)數據庫,致力于構…

Cadence學習筆記4

想到一個思路理解過程,記錄一下: 就是我在別的地方,前一天的那些 Lib 都不在了,突然發現自己好像就在 Cadence 中畫不了 PCB 了。這就引發了我思考在 Cadence 中如何進行繪制的一個整體的流程。 首先得有原理圖,那么原…

Linux--git

ok,我們今天來學習如何在Linux上建立鏈接git 版本控制器Git 不知道你?作或學習時,有沒有遇到這樣的情況:我們在編寫各種?檔時,為了防??檔丟失,更改 失誤,失誤后能恢復到原來的版本,不得不…

(七)Spring Boot學習——Redis使用

有部分內容是常用的,為了避免每次都查詢數據庫,將部分數據存入Redis。 一、 下載并安裝 Redis Windows 版的 Redis 官方已不再維護,你可以使用 微軟提供的 Redis for Windows 版本 或者 使用 WSL(Windows Subsystem for Linux&a…

HarmonyOS NEXT 聲明式UI語法學習筆記-創建自定義組件

基礎語法概述 ArkTS的基本組成 裝飾器:用于裝飾類、結構、方法以及變量,并賦予其特殊含義。如上圖都是裝飾器,Component表示自定義組件,Entry表示表示自定義組件的入口組件,State表示組件中的狀態變量,當狀…

【ElasticSearch】學習筆記

一、lucene的組成 segment是一個具備完整搜索功能的最小單元。 多個segment組成了一個單機文本檢索庫lucene。 inverted index:倒排索引,用于快速根據關鍵詞找到對應的文章term index: 構建出關鍵詞的目錄樹,解決了term dictionary數據量過大&#xff…

SSL/TLS 1.2過程:Client端如何驗證服務端證書?

快速回顧非對稱加密和對稱加密 首先快速說一下非對稱加密和對稱加密。非對稱加密,就是有一個公鑰和私鑰(成對存在)。 公鑰對一段文本A加密得到文本B,只有對應的私鑰能對B解密得到A。 私鑰對一段文本C加密得到文本D,只有對應的公鑰能對D解密得…

ChatGPT、DeepSeek、Grok:AI 語言模型的差異與應用場景分析

📝個人主頁🌹:一ge科研小菜雞-CSDN博客 🌹🌹期待您的關注 🌹🌹 1. 引言 人工智能(AI)語言模型正在快速發展,ChatGPT(OpenAI)、DeepSe…

正點原子[第三期]Arm(iMX6U)Linux移植學習筆記-4 uboot目錄分析

前言: 本文是根據嗶哩嗶哩網站上“Arm(iMX6U)Linux系統移植和根文件系統構鍵篇”視頻的學習筆記,在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。 引用: …

matlab 控制系統GUI設計-PID控制超前滯后控制

1、內容簡介 matlab164-控制系統GUI設計-PID控制超前滯后控制 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

介紹HTTP協議基本結構與Linux中基本實現HTTPServer

介紹HTTP協議基本結構與基本實現HTTPServer HTTP協議 前面已經了解了協議的重要性并且已經定義了屬于我們自己的協議,但是在網絡中,已經有一些成熟的協議,最常用的就是HTTP協議 在互聯網世界中,HTTP(HyperText Tran…

Linux和RTOS簡析

以下是針對 Linux驅動開發、RTOS(實時操作系統)任務狀態(就緒態) 以及 互斥鎖 的詳細解釋: 一、Linux設備驅動 1. 什么是設備驅動? 定義:設備驅動是操作系統內核的一部分,用于管理…

docker 常用命令大全(二),docker 鏡像操作 ,持續更新

docker 相關的命令 在公共倉庫中下載 docker pull bitnami/postgresql:12.8.0查看鏡像 docker images |grep postgresql打tag推送到本地倉庫 docker tag postgresql:12.8.0 docker.公司域名.com/library/postgresql:12.8.0推送到本地倉庫 docker push docker.公司域名com…

Git使用和原理(3)

1.遠程操作 1.1分布式版本控制系統 我們?前所說的所有內容(?作區,暫存區,版本庫等等),都是在本地!也就是在你的筆記本或者 計算機上。?我們的 Git 其實是分布式版本控制系統!什么意思呢&a…