C#二叉樹

C#二叉樹

二叉樹是一種常見的數據結構,它是由節點組成的一種樹形結構,其中每個節點最多有兩個子節點。二叉樹的一個節點通常包含三部分:存儲數據的變量、指向左子節點的指針和指向右子節點的指針。二叉樹可以用于多種算法和操作,如搜索、排序和遍歷。

在這里插入圖片描述

二叉樹遍歷

遍歷方式順序C#遞歸實現核心代碼
前序遍歷根 → 左 → 右Console.Write(root.val); → 遞歸左 → 遞歸右
中序遍歷左 → 根 → 右遞歸左 → Console.Write(root.val); → 遞歸右
后序遍歷左 → 右 → 根遞歸左 → 遞歸右 → Console.Write(root.val);

二叉樹的應用場景

  1. 快速查找與排序
    • 二叉搜索樹用于實現字典、數據庫索引(如B樹、B+樹的基礎)。
  2. 表達式樹
    • 編譯器解析數學表達式時構建二叉樹,葉節點為操作數,非葉節點為運算符。
  3. 哈夫曼編碼
    • 通過構建最優二叉樹實現數據壓縮。
  4. 決策樹與機器學習
    • 二叉樹結構用于分類和回歸模型的決策過程。

二叉樹的優缺點

優點缺點
邏輯清晰,易于實現遞歸操作普通二叉樹可能退化為鏈表(時間復雜度升至O(n))
二叉搜索樹支持高效查找/插入平衡二叉樹實現復雜(如AVL樹的旋轉操作)
天然適合分治算法(如快速排序)存儲指針占用額外內存空間
實例1
using System;
using System.Collections.Generic;public class TreeNode
{public int val;public TreeNode left;public TreeNode right;public TreeNode(int x) { val = x; }
}class BinaryTreeDemo
{static void Main(){// 構建二叉樹TreeNode root = new TreeNode(1){left = new TreeNode(2){left = new TreeNode(4),right = new TreeNode(5)},right = new TreeNode(3)};Console.WriteLine("前序遍歷:");PreOrder(root); // 輸出: 1 2 4 5 3Console.WriteLine("\n層序遍歷:");LevelOrder(root); // 輸出: 1 2 3 4 5}// 前序遍歷static void PreOrder(TreeNode root){if (root == null) return;Console.Write(root.val + " ");PreOrder(root.left);PreOrder(root.right);}// 層序遍歷static void LevelOrder(TreeNode root){if (root == null) return;Queue<TreeNode> queue = new Queue<TreeNode>();queue.Enqueue(root);while (queue.Count > 0){TreeNode node = queue.Dequeue();Console.Write(node.val + " ");if (node.left != null) queue.Enqueue(node.left);if (node.right != null) queue.Enqueue(node.right);}}
}
實例2
public class TreeNode<T>
{public T Value { get; set; }public TreeNode<T> Left { get; set; }public TreeNode<T> Right { get; set; }public TreeNode(T value){Value = value;Left = null;Right = null;}
}public class BinaryTree<T>
{public TreeNode<T> Root { get; private set; }public BinaryTree(){Root = null;}// 插入新值到二叉樹中public void Add(T value){if (Root == null){Root = new TreeNode<T>(value);}else{AddTo(Root, value);}}private void AddTo(TreeNode<T> node, T value){if (Comparer<T>.Default.Compare(value, node.Value) < 0){if (node.Left == null){node.Left = new TreeNode<T>(value);}else{AddTo(node.Left, value);}}else{if (node.Right == null){node.Right = new TreeNode<T>(value);}else{AddTo(node.Right, value);}}}// 前序遍歷(根-左-右)public void PreOrderTraversal(TreeNode<T> node){if (node != null){Console.WriteLine(node.Value); // 訪問節點PreOrderTraversal(node.Left);   // 遍歷左子樹PreOrderTraversal(node.Right);  // 遍歷右子樹}}// 中序遍歷(左-根-右)public void InOrderTraversal(TreeNode<T> node){if (node != null){InOrderTraversal(node.Left);   // 遍歷左子樹Console.WriteLine(node.Value); // 訪問節點InOrderTraversal(node.Right);  // 遍歷右子樹}}// 后序遍歷(左-右-根)public void PostOrderTraversal(TreeNode<T> node){if (node != null){PostOrderTraversal(node.Left);   // 遍歷左子樹PostOrderTraversal(node.Right);  // 遍歷右子樹Console.WriteLine(node.Value);   // 訪問節點}}
}
實例3
class BSTDemo
{static void Main(){TreeNode root = null;// 插入節點root = InsertBST(root, 5);InsertBST(root, 3);InsertBST(root, 7);InsertBST(root, 2);Console.WriteLine("中序遍歷BST:");InOrder(root); // 輸出: 2 3 5 7// 刪除節點3root = DeleteNode(root, 3);Console.WriteLine("\n刪除后:");InOrder(root); // 輸出: 2 5 7}// BST插入static TreeNode InsertBST(TreeNode root, int val){if (root == null) return new TreeNode(val);if (val < root.val)root.left = InsertBST(root.left, val);elseroot.right = InsertBST(root.right, val);return root;}// BST刪除(使用之前定義的DeleteNode方法)// 中序遍歷static void InOrder(TreeNode root){if (root == null) return;InOrder(root.left);Console.Write(root.val + " ");InOrder(root.right);}
}
實例4
class SymmetricTreeDemo
{static void Main(){// 對稱二叉樹TreeNode root1 = new TreeNode(1){left = new TreeNode(2) { left = new TreeNode(3), right = new TreeNode(4) },right = new TreeNode(2) { left = new TreeNode(4), right = new TreeNode(3) }};// 非對稱二叉樹TreeNode root2 = new TreeNode(1){left = new TreeNode(2) { right = new TreeNode(3) },right = new TreeNode(2) { right = new TreeNode(3) }};Console.WriteLine("root1是否對稱: " + IsSymmetric(root1)); // trueConsole.WriteLine("root2是否對稱: " + IsSymmetric(root2)); // false}static bool IsSymmetric(TreeNode root){if (root == null) return true;return CheckSymmetric(root.left, root.right);}static bool CheckSymmetric(TreeNode left, TreeNode right){if (left == null && right == null) return true;if (left == null || right == null) return false;return left.val == right.val && CheckSymmetric(left.left, right.right)&& CheckSymmetric(left.right, right.left);}
}
實例5
class DepthDemo
{static void Main(){TreeNode root = new TreeNode(1){left = new TreeNode(2) { left = new TreeNode(4) },right = new TreeNode(3)};Console.WriteLine("最大深度: " + MaxDepth(root)); // 輸出: 3}static int MaxDepth(TreeNode root){if (root == null) return 0;return Math.Max(MaxDepth(root.left), MaxDepth(root.right)) + 1;}
}
實例6
class PathSumDemo
{static void Main(){TreeNode root = new TreeNode(5){left = new TreeNode(4) { left = new TreeNode(11) { left = new TreeNode(7), right = new TreeNode(2) } },right = new TreeNode(8) { left = new TreeNode(13), right = new TreeNode(4) { right = new TreeNode(1) } }};Console.WriteLine("是否存在和為22的路徑: " + HasPathSum(root, 22)); // true}static bool HasPathSum(TreeNode root, int targetSum){if (root == null) return false;if (root.left == null && root.right == null)return root.val == targetSum;return HasPathSum(root.left, targetSum - root.val) || HasPathSum(root.right, targetSum - root.val);}
}

關鍵點總結

  1. 遞歸思想:二叉樹問題多通過遞歸解決,注意終止條件(root == null
  2. BST特性:插入/刪除時利用左小右大規則
  3. 遍歷選擇
    • 前序:根節點最先訪問
    • 中序:BST會得到有序序列
    • 層序:需要隊列輔助
  4. 空間復雜度
    • 遞歸:O(h)(h為樹高)
    • 層序:O(n)

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

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

相關文章

WinForm真入門(11)——ComboBox控件詳解

WinForm中 ComboBox 控件詳解? ComboBox 是 WinForms 中一個集文本框與下拉列表于一體的控件&#xff0c;支持用戶從預定義選項中選擇或直接輸入內容。以下從核心屬性、事件、使用場景到高級技巧的全面解析&#xff1a; 一、ComboBox 核心屬性? 屬性說明示例?Items?下拉…

超詳細解讀:數據庫MVCC機制

之前文章&#xff1a;Mysql鎖_exclusivelock for update寫鎖-CSDN博客 中有提到通過MVCC來實現快照讀&#xff0c;從而解決幻讀問題&#xff0c;這里詳細介紹下MVCC。 一、前言 表1&#xff1a;實例表t idk1122 表2&#xff1a;事務A、B、C的執行流程 事務A事務B事務Cstart …

【SpringCloud】從入門到精通【上】

今天主播我把黑馬新版微服務課程MQ高級之前的內容都看完了&#xff0c;雖然在看視頻的時候也記了筆記&#xff0c;但是看完之后還是忘得差不多了&#xff0c;所以打算寫一篇博客再溫習一下內容。 課程坐標:黑馬程序員SpringCloud微服務開發與實戰 微服務 認識單體架構 單體架…

力扣hot100_回溯(2)_python版本

一、39. 組合總和&#xff08;中等&#xff09; 代碼&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一個合法組合ans.append(pa…

AI平臺如何實現推理?數算島是一個開源的AI平臺(主要用于管理和調度分布式AI訓練和推理任務。)

數算島是一個開源的AI平臺&#xff0c;主要用于管理和調度分布式AI訓練和推理任務。它基于Kubernetes構建&#xff0c;支持多種深度學習框架&#xff08;如TensorFlow、PyTorch等&#xff09;。以下是數算島實現模型推理的核心原理、架構及具體實現步驟&#xff1a; 一、數算島…

cesium項目之cesiumlab地形數據加載

之前的文章我們有提到&#xff0c;使用cesiumlab加載地形出現了一些錯誤&#xff0c;沒有解決&#xff0c;今天作者終于找到了解決方法&#xff0c;下面描述一下具體步驟&#xff0c;首先在地理數據云下載dem數據&#xff0c;在cesiumlab中使用地形切片&#xff0c;得到terrain…

[Vue]App.vue講解

頁面中可以看見的內容不再在index.html中進行編輯&#xff0c;而是在App.vue中進行編輯。 組件化開發 在傳統的html開發中&#xff0c;一個頁面的資源往往都寫在同一個html文件中。這種模式在開發小規模、樣式簡單的項目時會相當便捷&#xff0c;但當項目規模越來越大&#xf…

sql-labs靶場 less-1

文章目錄 sqli-labs靶場less 1 聯合注入 sqli-labs靶場 每道題都從以下模板講解&#xff0c;并且每個步驟都有圖片&#xff0c;清晰明了&#xff0c;便于復盤。 sql注入的基本步驟 注入點注入類型 字符型&#xff1a;判斷閉合方式 &#xff08;‘、"、’、“”&#xf…

藍橋杯-小明的彩燈(差分)

問題描述&#xff1a; 差分數組 1. 什么是差分數組&#xff1f; 差分數組 c 是原數組 a 的“差值表示”&#xff0c;其定義如下&#xff1a; c[0] a[0]c[i] a[i] - a[i-1] &#xff08;i ≥ 1&#xff09; 差分數組記錄了相鄰元素的差值。例如&#xff0c;原數組 a [1, …

精品可編輯PPT | 基于湖倉一體構建數據中臺架構大數據湖數據倉庫一體化中臺解決方案

本文介紹了基于湖倉一體構建數據中臺架構的技術創新與實踐。它詳細闡述了數據湖、數據倉庫和數據中臺的概念&#xff0c;分析了三者的區別與協作關系&#xff0c;指出數據湖可存儲大規模結構化和非結構化數據&#xff0c;數據倉庫用于高效存儲和快速查詢以支持決策&#xff0c;…

最近api.themoviedb.org無法連接的問題解決

修改NAS的host需要用到SSH終端連接工具&#xff0c;比如常見的Putty&#xff0c;XShell&#xff0c;或者FinalShell等都可以&#xff0c;我個人還是習慣Putty。 1.輸入命令“ sudo -i ”回車&#xff0c;提示輸入密碼&#xff0c;密碼就是我們NAS的登錄密碼&#xff0c;輸入的…

0.機器學習基礎

0.人工智能概述&#xff1a; &#xff08;1&#xff09;必備三要素&#xff1a; 數據算法計算力 CPU、GPU、TPUGPU和CPU對比&#xff1a; GPU主要適合計算密集型任務&#xff1b;CPU主要適合I/O密集型任務&#xff1b; 【筆試問題】什么類型程序適合在GPU上運行&#xff1…

多類型醫療自助終端智能化升級路徑(代碼版.下)

醫療人機交互層技術實施方案 一、多模態交互體系 1. 醫療語音識別引擎 # 基于Wav2Vec2的醫療ASR系統 from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC import torchaudioclass MedicalASR:def __init__(self):self.processor = Wav2Vec2Processor.from_pretrai…

前端基礎:React項目打包部署服務器教程

問題背景 我做了一個React框架的前端的Node項目&#xff0c;是一個單頁面應用。 頁面路由用的是&#xff0c;然后使用了React.lazy在路由層級對每一個不同頁面進行了懶加載&#xff0c;只有打開那個頁面才會加載對應資源。 然后現在我用了Webpack5對項目進行了打包&#xff…

【深度學習:理論篇】--Pytorch基礎入門

目錄 1.Pytorch--安裝 2.Pytorch--張量 3.Pytorch--定義 4.Pytorch--運算 4.1.Tensor數據類型 4.2.Tensor創建 4.3.Tensor運算 4.4.Tensor--Numpy轉換 4.5.Tensor--CUDA&#xff08;GPU&#xff09; 5.Pytorch--自動微分 &#xff08;autograd&#xff09; 5.1.back…

使用 Spring Boot 快速構建企業微信 JS-SDK 權限簽名后端服務

使用 Spring Boot 快速構建企業微信 JS-SDK 權限簽名后端服務 本篇文章將介紹如何使用 Spring Boot 快速構建一個用于支持企業微信 JS-SDK 權限校驗的后端接口&#xff0c;并提供一個簡單的 HTML 頁面進行功能測試。適用于需要在企業微信網頁端使用掃一掃、定位、錄音等接口的…

工程師 - FTDI SPI converter

中國網站&#xff1a;FTDIChip- 首頁 UMFT4222EV-D UMFT4222EV-D - FTDI 可以下載Datasheet。 UMFT4222EVUSB2.0 to QuadSPI/I2C Bridge Development Module Future Technology Devices International Ltd. The UMFT4222EV is a development module which uses FTDI’s FT4222H…

rcore day6

批處理系統 (Batch System) 出現于計算資源匱乏的年代&#xff0c;其核心思想是&#xff1a; 將多個程序打包到一起輸入計算機&#xff1b;當一個程序運行結束后&#xff0c;計算機會 自動 執行下一個程序 應用程序難免會出錯&#xff0c;如果一個程序的錯誤導致整個操作系統都…

Linux系統學習Day2——在Linux系統中開發OpenCV

一、OpenCV簡介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的跨平臺計算機視覺和機器學習庫&#xff0c;廣泛應用于圖像處理、視頻分析、物體檢測等領域。它提供了豐富的算法和高效的工具集&#xff0c;支持C、Python等多種語言&#xff0c…

SAP Overview

SAP—企業運營的數字化引擎 在數字化轉型的浪潮中&#xff0c;SAP以其全面的企業應用軟件套件&#xff0c;為全球企業提供了強大的運營支持。SAP的模塊化解決方案覆蓋了企業運作的每一個關鍵環節&#xff0c;從銷售到倉庫管理&#xff0c;每個模塊都是針對特定業務需求精心設計…