數據結構與算法問題 AVL二叉平衡樹

AVL樹是帶有平衡條件的二叉查找樹。

這個平衡條件必須保持,并且它必須保證樹的深度是O(logN)。



一棵AVL樹是其每一個節點的左子樹和右子樹的高度最多差1的二叉查找樹。

(空樹的高度定義為-1)。


在插入以后。僅僅有那些從插入點到根節點的路徑上的節點的平衡可能被改變,由于僅僅有這些節點的子樹可能發生變化。當我們沿著這條路徑上行到根并更新平衡信息時。我們能夠找到一個節點,它的新平衡破壞了AVL條件。我們將指出怎樣在第一個這種節點(即最深的節點)又一次平衡這棵樹,并證明,這一又一次平衡保證整個樹滿足AVL特性。



讓我們把必須又一次平衡的這個節點叫做a。因為隨意節點最多有兩個兒子,因此高度不平衡時。a點的兩棵子樹的高度差2。easy看出,這樣的不平衡可能出如今以下四種情況中:

1.對a的左兒子的左子樹進行一次插入

2.對a的左兒子的右子樹進行一次插入

3.對a的右兒子的左子樹進行一次插入

4.對a的右兒子的右子樹進行一次插入




第一種情況是插入發生在“外邊"的情況(即左—左的情況或右—右的情況)。該情況通過對樹的一次單旋轉而完畢調整。另外一種情況是插入發生在”內部“的情形(即左—右的情況或右—左的情況),該情況通過略微復雜些的雙旋轉來處理。

AVL樹本質上還是一棵二叉搜索樹,它的特點是:



  1. 本身首先是一棵二叉搜索樹。

  2. 帶有平衡條件:每一個結點的左右子樹的高度之差的絕對值(平衡因子)最多為1


#include <iostream>
using namespace std;
const int LH = 1;
const int EH = 0;
const int RH = -1;
bool TRUE = 1;
bool FALSE = 0;typedef struct BSTNode
{int key;int bf;BSTNode *lchild, *rchild;
}BSTNode;//中序遍歷
void inordertree(BSTNode * &root)
{if (root){inordertree(root->lchild);cout << root->key<<",";inordertree(root->rchild);}
}//前序遍歷
void preordertree(BSTNode * &root)
{if (root){cout << root->key<<",";preordertree(root->lchild);preordertree(root->rchild);}
}
//右旋
void R_Rotate(BSTNode * &p)
{BSTNode *lc = p->lchild;p->lchild = lc->rchild;lc->rchild = p;p = lc;
}//左旋
void L_Rotate(BSTNode *& p)
{BSTNode *rc = p->rchild;p->rchild = rc->lchild;rc->lchild = p;p = rc;
}void LeftBalance(BSTNode * &T)
{BSTNode *lc = T->lchild;switch (lc->bf){case LH:T->bf = lc->bf = EH;R_Rotate(T);break;case RH:BSTNode *rd = lc->rchild;switch (rd->bf){case LH:T->bf = RH;lc->bf = EH;break;case EH:T->bf = lc->bf = EH;lc->bf = LH;break;}rd->bf = EH;L_Rotate(T->lchild);//先左旋R_Rotate(T);break;}
}void RightBalance(BSTNode *& T)
{BSTNode *rc = T->rchild;switch (rc->bf){case RH:T->bf = rc->bf = EH;L_Rotate(T);break;case LH:BSTNode *ld = rc->lchild;switch (ld->bf){case RH:T->bf = LH;rc->bf = EH;break;case EH:T->bf = rc->bf = EH;break;case LH:T->bf = EH;rc->bf = RH;break;}ld->bf = EH;R_Rotate(T->rchild);L_Rotate(T);break;}
}int insertAVL(BSTNode *& t, int e, bool &taller)
{if (!t){t = new BSTNode;t->key = e;t->lchild = t->rchild = NULL;t->bf = EH;taller = TRUE;}else{if (e == t->key){taller = FALSE;return 0;}if (e < t->key){if (!insertAVL(t->lchild, e,taller))return 0;if (taller){switch (t->bf){case LH:LeftBalance(t);taller = FALSE;break;case EH:t->bf = LH;taller = TRUE;break;case RH:t->bf = EH;taller = FALSE;break;}}}else{if (!insertAVL(t->rchild, e, taller))return 0;if (taller){switch (t->bf){case RH:RightBalance(t);taller = FALSE;break;case EH:t->bf = RH;taller = TRUE;break;case LH:t->bf = EH;taller = FALSE;break;}}}}return 1;
}BSTNode *search(BSTNode *t, int key)
{BSTNode *p = t;while (p){if (p->key == key)return p;else if (p->key < key)p = p->rchild;elsep = p->lchild;}return p;
}int main()
{BSTNode *root = NULL;BSTNode *r;bool taller = FALSE;int array[] = { 13, 24, 37, 90, 53 };for (int i = 0; i < 5; i++)insertAVL(root, array[i], taller);cout << "inorder traverse..." << endl;inordertree(root);cout << endl;cout << "preorder traverse..." << endl;preordertree(root);cout << endl;cout << "search key..." << endl;r = search(root, 37);if (r){cout << r->key << endl;}else{cout << "not find" << endl;}system("pause");return 0;
}


轉載于:https://www.cnblogs.com/jhcelue/p/6880336.html

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

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

相關文章

tomcat源碼閱讀之StandardHost和StandardEngine

StandardHost及UML類圖&#xff1a; 1、StandardHost類是Host接口的默認實現&#xff1b;其繼承自ContainerBase類&#xff0c;說明他也是一個容器類&#xff0c;既然是容器類&#xff0c;那肯定也有管道對象PipeLine和閥門&#xff0c;其基礎閥門&#xff08;Basic Valve&…

安防監控產業鏈全景梳理

安防行業是隨著現代社會安全需求應運而生的產業&#xff0c;圍繞著視頻監控技術的改革創新&#xff0c;行業從“看得見、看得遠、看得清到看得懂”&#xff0c;一共經歷模擬監控、數字監控、網絡高清監控和智能監控4個階段&#xff0c;每一階段的突破&#xff0c;都由上游技術的…

Vue項目搭建步驟

一&#xff0e; vue-cli初始化1. 全局安裝 vue-cli  npm install --global vue-cli2. 創建一個基于 webpack 模板的新項目  vue init webpack my-project3. 安裝依賴  cd my-project  npm install (換源安裝: npm install --registry https://registry.npm.taobao.org …

Python tutor 簡介

Python tutor 能夠直觀顯示object 引用關系。 網址是 http://www.pythontutor.com/visualize.html 先分享一下我的一個Python tutor&#xff1a; 點我出現神奇&#xff1a; 1&#xff09; 編輯code。 2&#xff09; 運行&#xff0c; 能夠看到以下界面。 這個工具是很酷的&…

提高CSS性能

1、選擇器 了解CSS的查找匹配原理&#xff0c;讓CSS更簡潔、高效使用高效率的CSS選擇器如何使CSS渲染更高效 總結 不要在ID選擇器前使用標簽名 一般寫法&#xff1a;div#divBox 更好寫法&#xff1a;#divBox 解釋&#xff1a; 因為ID選擇器是唯一的&#xff0c;加上div反而增加…

光學鏡頭行業發展現狀及趨勢,智能手機應用領域占比最高

一、光學鏡頭分類 光學鏡頭也叫攝像鏡頭或攝影鏡頭&#xff0c;簡稱鏡頭&#xff0c;其功能就是光學成像。光學鏡頭是光學成像系統中的必備組件&#xff0c;直接影響到成像質量的好壞&#xff0c;影響算法的實現和效果。從結構來看&#xff0c;光學鏡頭一般由精密五金、塑膠零…

關于_vmvare workstation裝32ubuntu的問題

剛開始啟動的時候是黑屏&#xff0c;沒有任何反應 1.bios也設置BIOS intel virtual technology 設置了enabled(開啟硬件虛擬化:要運行一些操作系統&#xff0c;虛擬化軟件和虛擬機&#xff0c;硬件虛擬化就需要啟用。大多數情況下&#xff0c;不需要虛擬化技術的操作系統可以正…

window screen (獲取屏幕信息)

document.write("屏幕寬度"screen.width);document.write("屏幕高度"screen.height);//&#xff08;整個電腦的屏幕的高&#xff09;上面和下面不是有效區的也被包括了 document.write("可用高度"screen.availHeight)//除了上面的任務欄 其他的全…

360°環視(全景影像)系統發展趨勢

360環視系統&#xff0c;系統同時采集車輛四周的影像&#xff0c;經過圖像處理單元一系列的智能算法處理&#xff0c;最終形成一幅車輛四周的全景俯視圖顯示在屏幕上&#xff0c;直觀地呈現出車輛所處的位置和周邊情況。系統大大地拓展了駕駛員對周圍和環境的感知能力&#xff…

python簡記

Python新手懵懂區&#xff1a; 1.不可變對象是傳值&#xff0c;可變對象是傳引用 2.不可變對象被真正復制&#xff0c;而可變對象只是復制了一個對它們的引用 3.*args --> 元組型參數傳遞 **args --> 字典型參數傳遞 4.淺拷貝&#xff1a;只復制了對對象的引用&#…

需求分析挑戰之旅(瘋狂的訂餐系統)(8)——最后的瘋狂

摘要&#xff1a; 說教性質的需求分析理論&#xff0c;各位看了也白看&#xff0c;所以咱們就來一個真實個案——“訂餐系統”體驗一下。“訂餐系統”貌似簡單&#xff0c;但陷阱重重&#xff0c;各種需求分析的經典場景將會一一重現&#xff0c;各位做好準備接受這個挑戰沒有&…

CPU架構:CPU架構詳細介紹

1 概述 CPU架構是CPU商給CPU產品定的一個規范&#xff0c;主要目的是為了區分不同類型的CPU。目前市場上的CPU分類主要分有兩大陣營&#xff0c;一個是intel、AMD為首的復雜指令集CPU&#xff0c;另一個是以IBM、ARM為首的精簡指令集CPU。不同品牌的CPU&#xff0c;其…

【NOIP】關押罪犯

帶權并查集&#xff0c;其實這種并查集的核心就是“向量” 1 #include<cstdio>2 #include<iostream>3 #include<algorithm>4 using namespace std;5 int n,m,p[20001],r[20001]; //0表示在同一監獄&#xff0c;1表示在不同監獄 6 struct node{7 int…

數學之路(3)-機器學習(3)-機器學習算法-SVM[7]

SVM是新近出現的強大的數據挖掘工具&#xff0c;它在文本分類、手寫文字識別、圖像分類、生物序列分析等實際應用中表現出非常好的性能。SVM屬于監督學習算法&#xff0c;樣本以屬性向量的形式提供&#xff0c;所以輸入空間是Rn的子集。 圖1 如圖1所示&#xff0c;SVM的目標是找…

Dalvik指令備忘

跳轉指令 if-eq vx, vy, 目標 如果vx vy注2&#xff0c;跳轉到目標。if-ne vx,vy, 目標 如果vx ! vy注2&#xff0c;跳轉到目標。 if-lt vx,vy, 目標 如果vx < vy注2&#xff0c;跳轉到目標。 if-ge vx, vy, 目標 如果vx > vy注2&#xff0c;跳轉到目標。 if-gt vx,vy, …

CPU、GPU、FPGA、ASIC等AI芯片特性及對比

1、前言 目前&#xff0c;智能駕駛領域在處理深度學習AI算法方面&#xff0c;主要采用GPU、FPGA 等適合并行計算的通用芯片來實現加速。同時有部分芯片企業開始設計專門用于AI算法的ASIC專用芯片&#xff0c;比如谷歌TPU、地平線BPU等。在智能駕駛產業應用沒有大規模興起和批量…

個人博客03

昨天編寫登錄界面、注冊界面的代碼。 今天依舊做這些。 遇到的問題為數據庫連接不上。轉載于:https://www.cnblogs.com/qilin20/p/8068555.html

人工智能Ai芯片層出不窮,GPU、FPGA、ASIC用于人工智能的優勢和劣勢對比

人工智能&#xff08;AI&#xff09;主要包括三大要素&#xff0c;分別是數據、算法和算力。其中數據是基礎&#xff0c;正是因為在實際應用當中的數據量越來越大&#xff0c;使得傳統計算方式和硬件難以滿足要求&#xff0c;才催生了AI應用的落地。而算法是連接軟件、數據、應…

dom和bom

先看幾個兩個例題&#xff1a; 星座對應日期&#xff1a; <select id"s1">   <option>a</option>   <option>b</option>   <option>c</option>   <option>d</option>   </select>   <se…

分享自己針對Automation做的兩個成熟的框架(QTP 和Selenium)

自己在google code中開源了自己一直以來做的兩個自動化的框架&#xff0c;一個是針對QTP的一個是針對Selenium的&#xff0c;顯而易見&#xff0c;一個是商業的UI automation工具&#xff0c;一個是開源的自動化工具。 只是代碼&#xff0c;可能你直接看的話&#xff0c;有點不…