C++算法(10):二叉樹的高度與深度,(C++代碼實戰)

引言

在二叉樹的相關算法中,高度(Height)深度(Depth)是兩個容易混淆的概念。本文通過示例和代碼實現,幫助讀者清晰區分二者的區別。


定義與區別

屬性定義計算方式
深度從根節點到該節點的邊數根節點深度為0
高度從該節點到最遠葉子節點的邊數葉子節點高度為0

核心區別

  • 深度是自上而下從根節點到當前節點的路徑長度。

  • 高度是自下而上從當前節點到最遠葉子節點的路徑長度。

  • 樹的高度等于根節點的高度,也等于樹的最大深度。


示例與表格

以下圖二叉樹為例:

       A/   \B     C/       \D         E

各節點的屬性如下表:

節點深度高度
A02
B11
C11
D20
E20

C++實現

1. 樹節點定義

struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

2. 計算高度(遞歸)

int height(TreeNode* root) {if (!root) return -1; // 空節點高度為-1return 1 + max(height(root->left), height(root->right));
}

3. 計算深度(遞歸搜索)

int depth(TreeNode* root, TreeNode* target) {if (!root) return -1; // 未找到目標if (root == target) return 0; // 找到目標,深度為0int left = depth(root->left, target);if (left != -1) return left + 1; // 左子樹中找到,深度+1int right = depth(root->right, target);return (right != -1) ? right + 1 : -1;
}

注意事項

  1. 定義差異:某些場景中,深度和高度的計算可能基于節點數而非邊數。例如:

    • 根節點深度為1,葉子節點高度為1。

    • 此時樹的高度等于最大深度,需調整代碼邏輯。

  2. 應用場景

    • 高度常用于平衡二叉樹判斷(如AVL樹)。

    • 深度常用于路徑問題(如最大深度)。


總結

  • 高度關注當前節點到葉子的最長路徑。

  • 深度關注根節點到當前節點的路徑。

  • 代碼實現需根據具體定義調整邊界條件。

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

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

相關文章

AI Agent開發第35課-揭秘RAG系統的致命漏洞與防御策略

第一章 智能客服系統的安全悖論 1.1 系統角色暴露的致命弱點 當用戶以"你好"開啟對話后追問"你之前說了什么",看似無害的互動實則暗藏殺機。2024年數據顯示,93%的開源RAG系統在該場景下會完整復述初始化指令,導致系統角色定義(如電商導購)被完全暴露…

獲取電腦信息(登錄電腦的進程、C盤文件信息、瀏覽器信息、IP)

電腦的進程信息 // 獲取登錄電腦的進程信息String os System.getProperty("os.name").toLowerCase();String command;if (os.contains("win")) {command "tasklist";} else {command "ps -ef";}try {Process process new ProcessB…

如何在騰訊云Ubuntu服務器上部署Node.js項目

最近弄了一個Node.js項目,包含前端用戶前臺,管理后臺和服務端API服務三個項目,本地搭建好了,于是在騰訊云上新建了個Ubuntu 24.04服務器,想要將本地的Node.js項目部署上去,包括環境配置和數據庫搭建。 本文…

國產AI新突破!全球首款無限時長電影生成模型SkyReels-V2開源:AI視頻進入長鏡頭時代!

在 AI 技術日新月異的今天,我們再次見證了歷史性的突破。 昆侖萬維 SkyReels 團隊于近日正式發布了全球首款支持無限時長的電影生成模型——SkyReels-V2,并免費開源。這無疑為 AI 視頻領域掀開了嶄新的一頁,標志著 AI 視頻正式邁入長鏡頭時代…

SpringAI系列 - MCP篇(一) - 什么是MCP

目錄 一、引言二、MCP核心架構三、MCP傳輸層(stdio / sse)四、MCP能力協商機制(Capability Negotiation)五、MCP Client相關能力(Roots / Sampling)六、MCP Server相關能力(Prompts / Resources / Tools)一、引言 之前我們在接入大模型時,不同的大模型通常都有自己的…

一個很簡單的機器學習任務

一個很簡單的機器學習任務 前言 基于線上colab做的一個簡單的案例,應用了線性回歸算法,預測了大概加州3000多地區的房價中位數 過程 先導入了Pandas,這是一個常見的Python數據處理函數庫 用Pandas的read_csv函數把網上一個共享數據集&…

【第十六屆 藍橋杯 省 C/Python A/Java C 登山】題解

題目鏈接:P12169 [藍橋杯 2025 省 C/Python A/Java C] 登山 思路來源 一開始想的其實是記搜,但是發現還有先找更小的再找更大的這種路徑,所以這樣可能錯過某些最優決策,這樣不行。 于是我又想能不能從最大值出發往回搜&#xf…

軟件工程師中級考試-上午知識點總結(上)

我總結的這些都是每年的考點,必須要記下來的。 1. 計算機系統基礎 1.1 碼 符號位0表示正數,符號位1表示負數。補碼:簡化運算部件的設計,最適合進行數字加減運算。移碼:與前幾種不同,1表示,0表…

Python Cookbook-6.7 有命名子項的元組

任務 Python 元組可以很方便地被用來將信息分組,但是訪問每個子項都需要使用數字索引,所以這種用法有點不便。你希望能夠創建一種可以通過名字屬性訪問的元組。 解決方案 工廠函數是生成符合要求的元組的子類的最簡單方法: #若在2.4中可使用operator…

win10設置軟件開機自啟

參考教程:windows10應用程序設置了開機啟動,但沒有自啟_win10軟件設置了自啟動但是不能自啟動-CSDN博客 主要設置是安全策略:

自注意力機制、多頭自注意力機制、填充掩碼 Python實現

原理講解 【Transformer系列(2)】注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制超詳細講解 自注意力機制 import torch import torch.nn as nn# 自注意力機制 class SelfAttention(nn.Module):def __init__(self, input…

【大模型】Browser-Use AI驅動的瀏覽器自動化工具

Browser-Use AI驅動的瀏覽器自動化工具 1. 項目概述2. 核心架構3. 實戰指南3.1 環境安裝3.2 快速啟動3.3 進階功能 4. 常見問題與解決5. 項目優勢與局限6. 擴展資源7. 總結 1. 項目概述 項目地址:browser-use Browser-Use 是一個開源工具,旨在通過 AI 代…

ubuntu20.04安裝安裝x11vnc服務基于gdm3或lightdm這兩種主流的顯示管理器。

前言:在服務端安裝vnc服務,可以方便的遠程操作服務器,而不用非要插上顯示器才行。所以在服務器上安裝vnc是很重要的。在ubuntu20中,默認的顯示管理器已經變為gdm3,它可以帶來與 GNOME 無縫銜接的體驗,強調功…

用銀河麒麟 LiveCD 快速查看原系統 IP 和打印機配置

原文鏈接:用銀河麒麟 LiveCD 快速查看原系統 IP 和打印機配置 Hello,大家好啊!今天給大家帶來一篇在銀河麒麟操作系統的 LiveCD 或系統試用鏡像環境下,如何查看原系統中電腦的 IP 地址與網絡打印機 IP 地址的實用教程。在系統損壞…

C++——STL——容器deque(簡單介紹),適配器——stack,queue,priority_queue

目錄 1.deque(簡單介紹) 1.1 deque介紹: 1.2 deque迭代器底層 1.2.1 那么比如說用迭代器實現元素的遍歷,是如何實現的呢? 1.2.2 頭插 1.2.3 尾插 1.2.4 實現 ?編輯 1.2.5 總結 2.stack 2.1 函數介紹 2.2 模…

Java并發編程-線程池

Java并發編程-線程池 線程池運行原理線程池生命周期線程池的核心參數線程池的阻塞隊列線程池的拒絕策略線程池的種類newFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewScheduledThreadPool 創建線程池jdk的Executors(不建議,會導致OOM)jdk的ThreadP…

【前沿】成像“跨界”測量——掃焦光場成像

01 背景 眼睛是人類認識世界的重要“窗口”,而相機作為眼睛的“延伸”,已經成為生產生活中最常見的工具之一,廣泛應用于工業檢測、醫療診斷與影音娛樂等領域。傳統相機通常以“所見即所得”的方式記錄場景,傳感器捕捉到的二維圖像…

TM1640學習手冊及示例代碼

數據手冊 TM1640數據手冊 數據手冊解讀 這里我們看管腳定義DIN和SCLK,一個數據線一個時鐘線 SEG1~SEG8為段碼,GRID1~GRID16為位碼(共陰極情況下) 這里VDD給5V 數據指令 數據命令設置 地址命令設置 顯示控制命令 共陰極硬件連接圖…

uni-app 開發企業級小程序課程

課程大小:7.7G 課程下載:https://download.csdn.net/download/m0_66047725/90616393 更多資源下載:關注我 備注:缺少兩個視頻5-14 tabs組件進行基本的數據展示和搜索歷史 處理searchData的刪除操作 1-1導學.mp4 2-10小程序內…

判斷點是否在多邊形內

代碼段解析: const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); 第一部分:(yi > y) !== (yj > y) 作用:檢查點 (x,y) 的垂直位置是否跨越多邊形的當前邊。 yi > y 和 yj > y 分別檢查邊的兩個端…