數據查找 二叉查找樹

查找一般分為有序查找和無序查找,這邊在講有序查找

例二分查找

? ? ? ? 二分查找就是在有序數組中,通過mid=(low+high)/2來判定中間值,將中間值與待查找的值進行比較,如果待查找的值大于中間值,那么就將范圍縮小,查找右邊;如果待查找的值小于中間值,那么查找左邊;如果待查找的值等于中間值,查找成功。

int BinarySearch(int R[],int n, int K){
//在數組R中對半查找K,R中關鍵詞遞增有序int low = 1, high = n, mid;while(low <= high){ //在Rlow…Rhigh之間查找Kmid=(low+high)/2;if(K<R[mid]) high=mid-1; //在左半部分查找else if(K>R[mid]) low=mid+1; //在右半部分查找else return mid; //查找成功}return -1; //查找失敗
}

? ? ? ? ? 在該算法中確定比較值是非常重要的一件事,不同的比較值的確定可以決定不同的時間復雜度。所以還可以拓展出類似斐波那契查找,插值查找之類的算法。

二叉查找樹

例1.查找

????????其實二叉查找樹在這邊更像是一種結構,就是結點的左孩子一定小于結點,結點右孩子一定大于結點。查找到數據之后往往還要對數據進行處理,在處理過后還要保持原有結構,是比較困難的地方。

BSTnode* Search2(BSTnode* root, int K){ BSTnode* p = root;while (p != NULL) {if (K < p->key) p = p->left;else if (K > p->key) p = p->right;else return p;}return NULL;
}

例2.插入

就是找到對應的位置,然后建立新的結點。

void Insert(BSTnode* &root, int K){if (root == NULL) root = new BSTnode(K); else if (K < root->key) Insert(root->left, K);else if (K > root->key) Insert(root->right, K);
}

例3.刪除

????????這邊的刪除是在二叉樹中一定有值等于k的結點的情況下,否則要修改一些代碼。

void remove(BSTnode* &root, int K) {if(root==NULL) return;if(K<root->key) remove(root->left, K); //在左子樹刪Kelse if(K>root->key) remove(root->right, K); //在右子樹刪Kelse if(root->left!=NULL && root->right!=NULL){BSTnode *s=root->right;while(s->left!=NULL) s=s->left;root->key=s->key; //s為t右子樹中根序列第一個結點remove(root->right, s->key);}else{ BSTnode* oldroot=root;root=(root->left!=NULL)? root->left:root->right;delete oldroot;}
}

例4.高度平衡樹

? ? ? ? 高度平衡樹是二叉查找樹中的一種,它的左右孩子的高度差不會大于1,它通過變形、旋轉,讓樹的結構變得相對“矮胖”,方便后續處理縮小時間。但是這種結構就會對數據操作的過程提出很多額外的要求。

????????下面是關于旋轉的一些基本操作。這邊的代碼都比較抽象,適合配合圖形理解。

????????以LL為例,就是新插入的結點,在A結點的左孩子的左子樹上(A結點是從下往上數第一個不平衡的點),插入之后導致不再平衡。于是A結點的左孩子(設為B結點)的右孩子單獨拎出來,把右孩子變成A結點的左孩子,然后將這個拎出的B結點作為新的結點,它的右孩子連接到A結點上。

struct AVLnode {int key; //關鍵詞int height; //以該結點為根的子樹高度AVLnode *left, *right;AVLnode(int K){ key=K; height=0; left=right=NULL; }
};
int Height(AVLnode *t){ return(t==NULL)?-1:t->height; }
int max(int a, int b){ return (a>b)? a:b; }
void UpdateHeight(AVLnode *t){t->height = max(Height(t->left),Height(t->right))+1;
}void LL(AVLnode* &A) {AVLnode *B = A->left;A->left = B->right;B->right = A;UpdateHeight(A);UpdateHeight(B);A = B;
}void RR(AVLnode* &A) {AVLnode *B = A->right;A->right = B->left;B->left = A;UpdateHeight(A);UpdateHeight(B);A = B;
}void RL(AVLnode* &A){LL(A->right);RR(A);
}void LR(AVLnode* &A) {RR(A->left);LL(A);
}

AVL樹插入算法的實現

void ReBalance(AVLnode* &t) {if(t==NULL) return;if(Height(t->left) - Height(t->right)==2){ if(Height(t->left->left) >= Height(t->left->right)) LL(t);elseLR(t);}else if(Height(t->right) - Height(t->left)==2){if(Height(t->right->right) >= Height(t->right->left)) RR(t);elseRL(t);}UpdateHeight(t);
}void Insert(AVLnode* &root, int K) {if(root==NULL) root=new AVLnode(K);else if(K < root->key) //在左子樹插入Insert(root->left, K);else if(K > root->key) //在右子樹插入Insert(root->right, K);ReBalance(root);
}

AVL樹刪除算法的實現

void remove(AVLnode* &root, int K) {if(root==NULL) return;if(K<root->key) remove(root->left, K); //在左子樹刪Kelse if(K>root->key) remove(root->right, K); //在右子樹刪Kelse if(root->left!=NULL && root->right!=NULL){AVLnode *s=root->right;while(s->left!=NULL) s=s->left;root->key=s->key; //s為t右子樹中根序列第一個結點remove(root->right, s->key);}else{ AVLnode* oldroot=root;root=(root->left!=NULL)? root->left:root->right;delete oldroot;}ReBalance(root);
}

所以其實比起怎么插入、刪除,更重要的是怎么保持原來的結構

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

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

相關文章

幾款開源的安全監控與防御工具分享

安全監控與防御工具概述 在現代網絡安全架構中,合理選擇和部署一系列的安全監控、檢測、響應工具至關重要。下面我們將介紹一些常見的安全工具,包括 Elkeid、Wazuh、Caldera、ELK、Snort、Suricata、OpenHFW、OSSEC、GScan 和 Sysom,并詳細介紹它們的下載鏈接、用處、使用方…

Elasticsearch:ES|QL 改進的時間線

作者&#xff1a;來自 Elastic Toms Mura 讓我們回顧一下 ES|QL 的歷史和它的改進。 更多閱讀&#xff0c;Elasticsearch&#xff1a;ES|QL 查詢展示。 Elasticsearch 配備了眾多新功能&#xff0c;幫助你為自己的用例構建最佳搜索方案。查看我們的示例筆記本了解更多內容&…

Linux | Bash 子字符串提取

注&#xff1a;本文為 “ Bash 子字符串提取” 相關合輯。 英文引文&#xff0c;機翻未校。 如有內容異常&#xff0c;請看原文。 How to Extract Bash Substring? [5 methods] 如何提取 Bash 子字符串&#xff1f;[5 種方法] 2024-04-28 00:00:00 In Bash, a substring is…

Vue2 前端開發 - vue-quill-editor 富文本編輯器(編輯器基礎案例、編輯器配置參數解讀、編輯器事件)

一、vue-quill-editor 1、vue-quill-editor 概述vue-quill-editor 是一個基于 Quill 富文本編輯器的 Vue 組件vue-quill-editor 在 Vue 2 項目中可以很方便地集成與使用2、vue-quill-editor 安裝 執行如下指令&#xff0c;安裝 vue-quill-editor npm install vue-quill-editor …

斷網情況下,網線直連 Windows 筆記本 和Ubuntu 服務器

在斷網情況下&#xff0c;通過網線直連 Windows 筆記本 和 Ubuntu 服務器&#xff0c;并使用 VSCode 訪問服務器及 Docker 容器 的步驟如下&#xff1a;1. 物理連接&#xff08;網線直連&#xff09; 1.1 使用網線連接 用 網線&#xff08;Cat5e 或更高&#xff09; 連接 Windo…

消息隊列總結

為什么需要消息隊列&#xff1f; 隨著互聯網快速發展&#xff0c;業務規模不斷擴張&#xff0c;技術架構從單體演進到微服務&#xff0c;服務間調用復雜、流量激增。為了解耦服務、合理利用資源、緩沖流量高峰&#xff0c;「消息隊列」應運而生&#xff0c;常用于異步處理、服務…

C#引用轉換核心原理:類型視角切換

&#x1f50d; C#引用轉換核心原理&#xff1a;類型視角切換 引用類型由內存指針和類型標記組成&#xff08;如圖1&#xff09;。引用轉換不改變內存地址&#xff0c;僅改變編譯器識別對象的“視角”&#xff1a; B myVar1 new B(); // 實際B類型對象 A myVar2 (A)myV…

重要發布丨MaxKB V2正式發布,助力用戶快速構建企業級智能體

2025年7月18日&#xff0c;MaxKB V2版本正式發布。MaxKB是一個強大易用的企業級智能體平臺&#xff0c;致力于解決企業AI落地所面臨的技術門檻高、部署成本高、迭代周期長等問題&#xff0c;讓企業用戶落地AI更簡單。 秉承“開箱即用&#xff0c;伴隨成長”的設計理念&#xff…

大語言模型任務分解與匯總:從認知瓶頸到系統化解決方案

一、緣起&#xff1a;為什么大模型需要"分而治之" 1.1 從一個真實場景說起 設想這樣一個場景&#xff1a;你要求GPT-4幫你完成一份包含市場調研、競品分析、財務預測和戰略規劃的商業計劃書。即使是最先進的大模型&#xff0c;面對這樣的復雜任務也會"力不從心&…

Spring核心注解@RequestMapping詳解

RequestMapping 是 Spring Framework 中一個核心注解&#xff0c;用于在 Spring MVC&#xff08;或 Spring WebFlux&#xff09;中將 HTTP 請求映射到特定的處理器&#xff08;Controller 中的方法&#xff09;或處理器類。它告訴 Spring 框架&#xff1a;當一個匹配特定條件的…

OSPF路由協議的協商過程

OSPF的知識點非常多&#xff0c;協議過程也是一個不大不小的知識點&#xff0c;今天就簡單的說一下&#xff0c;OSPF是如何進行協商的。OSPF&#xff08;Open Shortest Path First&#xff09;協議是一種用于路由選擇的動態鏈路狀態協議&#xff0c;是大型網絡普遍使用的動態路…

MySql:索引,結構

文章目錄注意事項結構注意事項 主鍵字段在建表時&#xff0c;會自動創建主鍵索引添加唯一約束時&#xff0c;數據庫實際上會添加唯一索引。 解釋&#xff1a; 增&#xff1a;創建&#xff1a; create [unique] index 索引名 on 表名 (字段名……)&#xff1b;-- 舉例 :給tb…

ts學習2

JavaScript 中的每個值都有一組行為&#xff0c;您可以通過運行不同的操作來觀察這些行為。這聽起來很抽象&#xff0c;但作為一個簡單的例子&#xff0c;考慮我們可能在名為 message 的變量上運行的一些操作。 // Accessing the property toLowerCase // on message and then…

k8s環境使用Operator部署Seaweedfs集群(下)

作者&#xff1a;閆乾苓 文章目錄4.4.3 部署seaweedfs集群4.4.4 驗證集群運行狀態4.4.5 測試集群功能4.4.3 部署seaweedfs集群 集群Yaml示例 apiVersion: seaweed.seaweedfs.com/v1 kind: Seaweed metadata:name: seaweed1namespace: default spec:image: chrislusf/seaweedf…

【橘子分布式】gRPC(理論篇)

一、簡介 我們在前面學習了thrift rpc的知識&#xff0c;我們從其中接觸到了IDL&#xff0c;編解碼協議&#xff0c;服務的遠程調用(調用遠程服務就像在在本地調用一樣)等各種概念。 其實我個人對thrift的使用并不多&#xff0c;我更多的是使用今天我們要提到的一個RPC框架稱之…

OSPF高級特性之GR

一、概述OSPF GR(Graceful Restart),在路由器發生故障或管理員干預的情況下重啟了OSPF進程時,重新構建控制平面時,轉發平面不受影響,仍可以正常轉發數據。在我們OSPF網絡環境當中,假設路由器為框式路由器,通常框式路由器有多個主控板,當主主控板發生故障時會切換到備主控板上。…

iOS 構建配置與 AdHoc 打包說明

iOS 構建配置與 AdHoc 打包說明 1. 背景 在 iOS 項目中&#xff0c;通常需要支持 多個環境的構建和分發&#xff0c;比如&#xff1a; 開發環境 (Debug) → 本地調試內測環境 (AdHoc) → 提供 QA / 產品經理測試預發布環境 (AdHoc_Release) → 和正式版配置一致&#xff0c;但通…

【52】MFC入門到精通——MFC串口助手(二)---通信版(發送數據 、發送文件、數據轉換、清空發送區、打開/關閉文件),附源碼

文章目錄1 完整 功能展示2 添加控件變量及聲明2.1 添加控件及變量2.2 SerialPortDlg.h: 頭文件3 函數實現3.1 數據發送3.1.2 寫數據、字符串轉3.2 發送文件3.2.1 打開文件3.2.2 發送文件3.3 清空發送區4 完整MFC項目項下載1 完整 功能展示 串口通信助手 頁面展示&#xff0c;功…

筆試——Day12

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 刪除公共字符 思路 模擬&#xff1a; 遇到需要刪除的字符&#xff0c;則不添加到結果中 代碼 第二題 題目&#xff1a; 兩個鏈表的第一個公共結點 思路 模擬&#x…

SpringMVC @ResponseBody注解詳解

概要ResponseBody是 Spring MVC 中的一個重要注解&#xff0c;用于指示方法的返回值應該直接作為 HTTP 響應體返回&#xff0c;而不是解析為視圖名稱。基本功能ResponseBody主要用于將Java對象轉換為HTTP響應體&#xff08;通常是JSON或XML&#xff09;繞過視圖解析器直接返回數…