日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

平衡二叉树模板

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 平衡二叉树模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node {int ndata; //記錄關鍵字數值node *l,*r;int nheight; //平衡因子 }; int height(node* p) //返回樹p的深度 {if(p==NULL)return -1;return p->nheight; } node* LLRotate(node* p) //對LL型直接在不平衡結點進行左旋轉 {node* p1;p1=p->l;p->l=p1->r;p1->r=p;p->nheight=max(height(p->l),height(p->r))+1; //結點的位置變了,要更新結點的高度值p1->nheight=max(height(p1->l),p->nheight)+1;return p1; } node* RRRotate(node* p) //對RR型直接在不平衡結點進行右旋轉 {node* p1;p1=p->r;p->r=p1->l;p1->l=p;p->nheight=max(height(p->l),height(p->r))+1;p1->nheight=max(height(p1->r),p->nheight)+1;return p1; } node* LRRotate(node* p) {p->l=RRRotate(p->l); //在不平衡結點p的左兒子處進行右旋轉return LLRotate(p); //在不平衡結點p處進行左旋轉并返回新的根 } node* RLRotate(node* p) {p->r=LLRotate(p->r); //在不平衡結點p的右兒子處進行左旋轉return RRRotate(p); //在不平衡結點p處進行左旋轉并返回新的根 } node* _Insert(int s,node* p) {if(p==NULL) //待插入的值賦給新開辟的結點{p=new node;p->ndata=s;p->nheight=0;p->l=p->r=NULL;}else if(s<p->ndata) //若待插入的值小于p的關鍵字數值,則插入到左子樹中{p->l=_Insert(s,p->l);if(height(p->l)-height(p->r)==2) //該樹出現不平衡{if(s<p->l->ndata) //若待插入的值插到了左兒子的左子樹上則單旋轉p=LLRotate(p);else //反之,雙旋轉p=LRRotate(p);}}else if(s>p->ndata) //道理同上{p->r=_Insert(s,p->r);if(height(p->l)-height(p->r)==-2){if(s>p->r->ndata)p=RRRotate(p);elsep=RLRotate(p);}}p->nheight=max(height(p->l),height(p->r))+1;return p; } int main() {int n;while(~scanf("%d",&n)){node *head=NULL;while(n--){int x;scanf("%d",&x);head=_Insert(x,head);}printf("%d\n",head->ndata);}return 0; }

總結

以上是生活随笔為你收集整理的平衡二叉树模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。