二叉查找(排序)樹你需要了解一下

簡介

二叉排序樹(Binary Sort Tree),又稱二叉查找樹(Binary Search Tree),亦稱二叉搜索樹,是一種重要的數據結構。

它有以下特性:

  1. 若左子樹不空,則左子樹上所有結點的值均小于它的根結點的值。
  2. 若右子樹不空,則右子樹上所有結點的值均大于它的根結點的值。

在一般情況下,查詢效率比鏈表結構要高。

性質

二叉排序樹(Binary Sort Tree)具有以下性質:

  1. 它的左子樹上所有節點的值均小于它的根節點的值。
  2. 它的右子樹上所有節點的值均大于它的根節點的值。
  3. 它的左右子樹也分別為二叉排序樹。

此外,查找最小和最大元素在二叉排序樹中也是非常簡單的,從根節點一直往左走,直到無路可走就可以得到最小值;從根節點一直往右走,直到無路可走就可以得到最大值。在插入新元素時,可以從根節點開始,遇鍵值較大者就向左,遇鍵值較小者就向右,一直到末端,就是插入點。

分類

二叉排序樹包括以下幾種:

  1. 滿二叉樹:在不增加樹的層數的前提下,無法在多添加一個節點的二叉樹就是滿二叉樹。
  2. 完全二叉樹:如果只是刪除了滿二叉樹最底層最右邊的連續若干個節點,這樣形成的二叉樹就是完全二叉樹。
  3. 二叉搜索樹:一種特殊的二叉樹,其左子樹上的所有節點的值均小于它的根節點的值,右子樹上的所有節點的值均大于它的根節點的值。
  4. 平衡二叉樹:一種特殊的二叉搜索樹,其左右子樹的高度差的絕對值不超過1。

應用場景

二叉排序樹的應用場景包括但不限于:

  1. 快速查找 :二叉排序樹的特性使得查找特定元素變得非常高效。在二叉搜索樹中,每次比較后可以確定下一步是向左還是向右,這使得查找時間復雜度可以保持在O(log n),其中n是樹中節點的數量。
  2. 插入和刪除 :二叉排序樹的插入和刪除操作也是高效的。當插入一個新的節點時,可以根據其值的大小來決定放在左子樹還是右子樹,或者在必要時進行調整以保持二叉排序樹的平衡。刪除節點時,也可以根據其位置和與相鄰節點的關系來決定如何刪除。
  3. 平衡二叉樹的應用 :平衡二叉樹如AVL樹、紅黑樹等,在實際應用中更為廣泛。例如紅黑樹被廣泛用于C++的STL中,如map和set的實現,還有Linux文件管理。AVL樹雖然應用相對較少,但windows對進程地址空間的管理用到了AVL樹。
  4. 大數據查找 :二叉排序樹非常適合處理大量數據,例如從10億數據里面找到前100大的數。通過構建一個最小堆,可以高效地找到最大的k個元素。
  5. 字典樹(Trie) :用在統計和排序大量字符串,如自動機、M數據庫索引。

總的來說,二叉排序樹是一種非常實用的數據結構,可以在許多場景下發揮重要作用。

時間復雜度

二叉排序樹的時間復雜度主要取決于樹的結構和操作類型。

對于查找操作,二叉排序樹在最壞的情況下(即完全二叉樹或接近完全二叉樹)下,時間復雜度為O(n),其中n為樹中節點的數量。然而,在平均情況下,二叉排序樹的查找時間復雜度為O(log n)。

對于插入操作,在最壞的情況下(即樹接近滿二叉樹),插入的時間復雜度為O(n)。但在平均情況下,插入時間復雜度為O(log n)。

對于刪除操作,如果刪除的是葉子節點,時間復雜度為O(log n)。如果刪除的是內部節點,時間復雜度為O(log n)。如果刪除的是根節點,且樹有兩個子節點,則刪除操作時間復雜度為O(log n)。

示例

以下是一個簡單的Java示例,演示了如何使用二叉排序樹(Binary Search Tree)來存儲和搜索整數:

public class BinarySearchTree {class Node {int key;Node left, right;public Node(int item) {key = item;left = right = null;}}Node root;BinarySearchTree() {root = null;}void insert(int key) {root = insertRec(root, key);}Node insertRec(Node root, int key) {if (root == null) {root = new Node(key);return root;}if (key < root.key) {root.left = insertRec(root.left, key);} else if (key > root.key) {root.right = insertRec(root.right, key);} else { // Duplicate keys not allowedreturn root;}return root;}void inorder()  {inorderRec(root);}void inorderRec(Node root) {if (root != null) {inorderRec(root.left);System.out.println(root.key);inorderRec(root.right);}}public static void main(String[] args) {BinarySearchTree tree = new BinarySearchTree();tree.insert(8);tree.insert(3);tree.insert(10);tree.insert(1);tree.insert(6);tree.insert(14);tree.insert(4);tree.insert(7);tree.insert(13);// tree.delete(10); // uncomment this to see the impact of deletion from BSTtree.inorder(); } 
} 

在這個示例中,我們定義了一個二叉排序樹的節點,它有一個鍵(key)和兩個子節點(left 和 right)。樹中的每個節點都滿足二叉排序樹的性質:左子樹上的所有節點的鍵都小于當前節點的鍵,右子樹上的所有節點的鍵都大于當前節點的鍵。我們在 insert() 方法中使用遞歸方式插入新的節點,并保證樹的性質。inorder() 方法用于按中序遍歷順序打印樹中的所有元素。

拓展

AVL樹你需要了解一下

紅黑樹你需要了解一下

滿二叉樹你需要了解一下

完全二叉樹你需要了解一下

哈夫曼樹你需要了解一下

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

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

相關文章

目標檢測YOLO系列從入門到精通技術詳解100篇-【圖像處理】目標檢測

目錄 幾個高頻面試題目 如何在超大分辨率的圖片中檢測目標? 1當超大分辨率圖像邂逅目標檢測任務 2You Only Look Twice

邊緣計算多角色智能計量插座 x 資產顯示標簽:實現資產追蹤與能耗管理的無縫結合

越來越多智慧園區、智慧工廠、智慧醫院、智慧商業、智慧倉儲物流等企業商家對精細化、多元化智能生態應用場景的提升&#xff0c;順應國家節能減排、環保的時代潮流&#xff0c;設計一款基于融合以太網/WiFi/藍牙智能控制的智能多角色插座應運而生&#xff0c;賦予智能插座以遙…

大數據學習(23)-hive on mapreduce對比hive on spark

&&大數據學習&& &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 承認自己的無知&#xff0c;乃是開啟智慧的大門 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主哦&#x1f91…

uniapp實現表單彈窗

uni.showModal({title: 刪除賬戶,confirmColor:#3A3A3A,cancelColor:#999999,confirmText:確定,editable:true,//顯示content:請輸入“delete”刪除賬戶,success: function (res) {console.log(res)if(res.confirm){if(res.contentdelete){console.log(123123123213)uni.setSto…

PCIE鏈路訓練-狀態跳轉1

A&#xff1a;12ms超時&#xff0c;或者再任何lane上檢測到Electrical Idle Exit&#xff1b; B&#xff1a; 1.發送“receiver detection”之后沒有一個lane的接收邏輯被rx檢測到 2.不滿足條件c&#xff0c;比如兩次detection出現差別&#xff1b; C&#xff1a;發送端在沒…

凸優化基礎與應用

諸神緘默不語-個人CSDN博文目錄 文章目錄 1. 線性規劃用SciPy求解 2. 二次規劃3. 半定規劃4. 錐規劃 凸優化是數學優化的一個重要分支&#xff0c;廣泛應用于各種工程和科學領域。它的核心特征在于優化問題的目標函數和約束條件是凸的&#xff0c;這使得找到全局最優解變得可行…

Ps:背景橡皮擦工具摳圖實例

背景橡皮擦工具 Background Eraser Tool由于是一個破壞性的工具&#xff08;直接刪除像素&#xff09;而少被人使用。 其實&#xff0c;它不僅是一個功能強大的摳圖工具&#xff0c;也是可以轉換為非破壞性運用的。 原圖&#xff08;注&#xff1a;圖片來自網絡&#xff09; 效…

微軟離Altman越近,離OpenAI就越遠!

大數據產業創新服務媒體 ——聚焦數據 改變商業 在OpenAI這場連續劇中&#xff08;之所以說是連續劇&#xff0c;這個事情肯定沒完&#xff0c;后面肯定還會出續集&#xff09;&#xff0c;讓我倍感意外的是&#xff0c;Altman剛跟OpenAI分手&#xff0c;“離婚手續”都還沒辦…

使用Pytorch從零開始構建WGAN

引言 在考慮生成對抗網絡的文獻時&#xff0c;Wasserstein GAN 因其與傳統 GAN 相比的訓練穩定性而成為關鍵概念之一。在本文中&#xff0c;我將介紹基于梯度懲罰的 WGAN 的概念。文章的結構安排如下&#xff1a; WGAN 背后的直覺&#xff1b;GAN 和 WGAN 的比較&#xff1b;…

selenium新版使用find_element/find_elements函數鎖定元素(替換原有find_element_by_xx)

css選擇器請參考&#xff1a;網絡爬蟲之css選擇器 原來的find_element_by_xx都被修改為find_element&#xff08;返回匹配到的第一個元素&#xff09;或find_elements&#xff08;返回全部的匹配元素&#xff09; from selenium.webdriver.common.by import By示例程序 選擇…

【Q3——30min】

1、介紹一下數據庫的三大范式 第一范式(1NF)&#xff1a;屬性不可分割&#xff0c;即每個屬性都是不可分割的原子項。(實體的屬性即表中的列) 第二范式(2NF)&#xff1a;滿足第一范式&#xff1b;且不存在部分依賴&#xff0c;即非主屬性必須完全依賴于主屬性。(主屬性即主鍵&a…

minio集群部署(k8s內)

一、前言 minio的部署有幾種方式&#xff0c;分別是單節點單磁盤&#xff0c;單節點多磁盤&#xff0c;多節點多磁盤三種方式&#xff0c;本次部署使用多節點多磁盤的方式進行部署&#xff0c;minio集群多節點部署最低要求需要4個節點&#xff0c;集群擴容時也是要求擴容的節點…

2、數倉理論概述與相關概念

1、問&#xff1a;數據倉庫 建設過程中 經常會遇到那些問題&#xff1f; 模型(邏輯)重復建設 數據不一致性 維度不一致&#xff1a;命名、維度屬性值、維度定義 指標不一致&#xff1a;命名、計算口徑 數據不規范(字段命名、表名、分層、主題命名規范) 2、OneData數據建設核心方…

python爬蟲HMAC加密案例:某企業信息查詢網站

聲明&#xff1a; 該文章為學習使用&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;違者后果自負&#xff0c;由此產生的一切后果均與作者無關 一、找出需要加密的參數 js運行 atob(‘aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvc2VhcmNoP2tleT0lRTQlQjglODclRTglQkUlQkUlRTklOUI…

飛槳——總結PPOCRLabel中遇到的坑

操作系統&#xff1a;win10 python環境&#xff1a;python3.9 paddleocr項目版本&#xff1a;2.7 1.報錯&#xff1a;ModuleNotFoundError: No module named Polygon&#xff08;已解決&#xff09; 已解決所以沒有復現報錯內容 嘗試方法一&#xff1a;直接使用pip命令安裝&…

oracle rac 19.3安裝補丁19.19

使用opatchauto apply DIR來進行安裝 1.升級之前先備份一下GRID_HOME和ORACLE_HOME 2.現在新的opatch安裝不需要先停止集群和數據庫&#xff0c;在升級過程中&#xff0c;他會自動關閉和啟動集群 3.先將OPatch&#xff08;P6880880&#xff09;包拷貝到$GRID_HOME和$ORACLE_HOM…

【Web安全】sqlmap的使用筆記及示例

【Web安全】sqlmap的使用筆記 文章目錄 【Web安全】sqlmap的使用筆記1. 目標2. 脫庫2.1. 脫庫&#xff08;補充&#xff09; 3. 其他3.1. 其他&#xff08;補充&#xff09; 4. 繞過腳本tamper講解 1. 目標 操作作用必要示例-u指定URL&#xff0c;檢測注入點sqlmap -u http://…

ts實現合并數組對象中key相同的數據

背景 在平常的業務中&#xff0c;后端同學會返回以下類似的結構數據 // 后端返回的數據結構 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…

實現極坐標圖表QPolarChart的角度軸范圍是[0,360]時,0度在水平右側

目錄 參考角度軸范圍是[0,360]時&#xff0c;0度在水平右側.h.cpp 參考 Qt數據可視化(QPolarChart雷達圖) 默認QPolarChart的范圍是[0,360]時&#xff0c;0度在垂直上方 如官方例子QValueAxis角度軸范圍是[-100,100] 角度軸范圍是[0,360]時&#xff0c;0度在水平右側 原理&am…

用eclipse搭建簡單的JavaWeb環境

在 Eclipse 中搭建 JavaWeb 項目的環境涉及到配置服務器、創建項目、添加庫等步驟。以下是基于 Eclipse 的 JavaWeb 項目搭建的簡要步驟&#xff1a; 步驟&#xff1a; 1. 安裝 Eclipse IDE for Java EE Developers 確保你已經安裝了 Eclipse IDE for Java EE Developers 版…