平衡二叉樹C++模板
輸出是中序遍歷,相當於排序二叉樹,看樹形修改printf位置即可
有錯誤請指出,網上很多平衡樹的程式碼其實是錯的...
#include <cstdio> #include <cstdlib> #include <iostream> #include <cstring> using namespace std; typedef struct Node { int data; int BF; struct Node *lc,*rc; } Node,*Tree; void LR(Tree *p) { //左旋 Tree R; R=(*p)->rc; (*p)->rc=R->lc; R->lc=(*p); *p=R; } void RR(Tree *p) { //右旋 Tree L; L=(*p)->lc; (*p)->lc=L->rc; L->rc=(*p); *p=L; } void LB(Tree *T) { Tree L,Lr; L=(*T)->lc; switch(L->BF) { case 1://新節點插入在T的左孩子的左子樹上,做單右旋處理 (*T)->BF=L->BF=0; RR(T); break; case -1://新插入節點在T的左孩子的右子樹上,做雙旋處理 Lr=L->rc; switch(Lr->BF) { case 1: (*T)->BF=-1; L->BF=0; break; case 0: (*T)->BF=L->BF=0; break; case -1: (*T)->BF=0; L->BF=1; break; } Lr->BF=0; LR(&(*T)->lc); RR(T); } } void RB(Tree *T) { Tree R,Rl; R=(*T)->rc; switch(R->BF) { case -1://新節點插在T的右孩子的右子樹上,要做單左旋處理 (*T)->BF=R->BF=0; LR(T); break; case 1://新節點插在T的右孩子的左子樹上,要做雙旋處理 Rl=R->lc; switch(Rl->BF) { case 1: (*T)->BF=0; R->BF=-1; break; case 0: (*T)->BF=R->BF=0; break; case -1: (*T)->BF=1; R->BF=0; break; } Rl->BF=0; RR(&(*T)->rc); LR(T); } } bool insert(Tree *T,int x,bool *taller) { //變數taller反應T長高與否 if(!*T) { *T=(Tree)malloc(sizeof(Node)); (*T)->data=x; (*T)->lc=(*T)->rc=NULL; (*T)->BF=0; *taller=true; } else { if(x==(*T)->data) { //不插入 *taller=false; return false; } if(x<(*T)->data) { //以下為左子樹插入 if(!insert(&(*T)->lc,x,taller))//未插入 return false; if(*taller) { //插入左子樹,左子樹深度增加 switch((*T)->BF) { case 1://深度若為1,則開始調整 LB(T); *taller=false; break; case 0://左右子樹等深,左子樹變深 (*T)->BF=1; *taller=true; break; case -1://右子樹比左子樹深,左右子樹等深 (*T)->BF=0; *taller=false; break; } } } else { //以下為右子樹插入 if(!insert(&(*T)->rc,x,taller)) return false; if(*taller) { //插入右子樹,右子樹深度增加 switch((*T)->BF) { case 1://左子樹比右子樹深,左右子樹等深 (*T)->BF=0; *taller=false; break; case 0://左右子樹等深,右子樹變深 (*T)->BF=-1; *taller=true; break; case -1://深度若為-1,則開始調整 RB(T); *taller=false; break; } } } } return true; } void ZX(Node *T) { if(T!=NULL) { ZX(T->lc); printf("%d ",T->data); ZX(T->rc); } } int main() { int n,A[1005]; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&A[i]); } Tree T=NULL; bool taller; for(int i=0; i<n; i++) insert(&T,A[i],&taller); ZX(T); printf("\n"); return 0; }
相關推薦
平衡二叉樹C++模板
輸出是中序遍歷,相當於排序二叉樹,看樹形修改printf位置即可 有錯誤請指出,網上很多平衡樹的程式碼其實是錯的... #include <cstdio> #include <cstdlib> #include <iostream> #
leetcode 110. 平衡二叉樹 C語言版
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。 本題中,一棵高度平衡二叉樹定義為: 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。 示例 1: 給定二叉樹 [3,9,20,null,null,15,7] 3 / \
leetcode 110. 平衡二叉樹 C語言版
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。 本題中,一棵高度平衡二叉樹定義為: 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。 示例 1: 給定二叉樹 [3,9,20,null,null,15,7] 3 / \ 9 20
資料結構(樹,二叉搜尋樹,平衡二叉樹 C++實現)
樹 樹(Tree)是n(n>=0)個結點的有限集合。n = 0時稱為空樹。在任意一顆非空樹中:(1)有且僅有一個特定的稱為根(Root)的結點;(2)當n > 1時,其餘結點可分為m (m > 0)個互不相交的有限集 T1T1 、 T2T2
判斷二叉樹是否是平衡二叉樹(C++)
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) {
STL原始碼筆記(18)—平衡二叉樹AVL(C++封裝+模板)
AVLTree平衡二叉樹 在幾年前剛學資料結構時,AVL-Tree只是一個僅僅需要掌握其概念的東西,今非昔比,借看STL原始碼剖析的契機希望從程式碼層面將其拿下。 1.簡介 二叉查詢樹給我們帶來了很多方便,但是由於其在有序序列插入時就會退化成單鏈表(時間複
平衡二叉樹AVL樹的實現(c++STL)
pre 根節點 code 先序 blog ltr ons void 過程 #include <iostream> using namespace std; template<class Type> class AVLtree;
數據結構 平衡二叉樹avl c++
歸納 all AI 例子 大於 樹節點 fin 深度 UC 平衡二叉樹:一顆空樹,或者是具有以下性質的二叉樹 左子樹和右子樹都是平衡二叉樹 左子樹和右子樹的深度只差不超過1 把二叉樹節點的平衡因子BF(Balance Factor)定義為該節點的左子樹深度減去右子樹深度
【C語言】平衡二叉樹
avl 簡介 二叉搜索樹 沒有 TP 假設 它的 left 操作 AVL樹簡介 AVL樹的名字來源於它的發明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL樹是最先發明的自平衡二叉查找樹(Self-Balancing Binary Searc
演算法導論 之 平衡二叉樹 - 建立 插入 查詢 銷燬 - 遞迴 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
演算法導論 之 平衡二叉樹 - 刪除 - 遞迴 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
平衡二叉樹(AVL樹) AVL樹(二)之 C++的實現
3、旋轉 在進行插入和刪除之前需要先了解AVL樹的旋轉操作。旋轉操作主要包括LL(左左)旋轉、LR(左右)旋轉、RR(右右)旋轉、RL(右左)旋轉,LL旋轉與RR旋轉對稱,LR旋轉與RL旋轉對稱。旋轉操作是在插入結點或刪除結點導致原AVL樹不平衡時進行的。我的理解是當二叉樹失衡的原因出現在“最低失衡根結點左
#資料結構與演算法學習筆記#劍指Offer35:是否平衡二叉樹/AVL樹 + 測試用例(Java、C/C++)
2018.11.3 前幾天有用遞迴實現了二叉樹的深度#資料結構與演算法學習筆記#劍指Offer36:二叉樹的深度(Java),因此可以對每個結點先序遍歷進行一次平衡驗證,只要確定每個結點都是平衡的
平衡二叉樹(C++實現)
平衡二叉樹的建立(插入節點) 二叉樹的刪除節點 刪除節點演算法思想:首先第一步需要找到要刪除的節點x,並分情況進行處理: 如果要刪除的節點為葉子節點,就找到了要刪除的節點,假設節點p是一個葉子節點,則直接刪除它。如果刪除節點之後,二叉樹不平衡
資料結構之---C語言實現平衡二叉樹(AVL樹)
//AVL(自動平衡二叉樹) #include <stdio.h> #include <stdlib.h> typedef int ElemType; //每個結點的平均值 typedef enum { EH = 0, LH =
平衡二叉樹的C語言實現(建立、插入、查詢、刪除、旋轉)【資料結構】
平衡二叉樹(AVL)或者是一顆空樹,或者是具有下列性質的非空二叉搜尋樹: (1). 任一結點的左、右子樹均為AVL樹; (2). 任一結點的左、右子樹高度差的絕對值不超過1。 對於二叉樹中任一結點T,其“平衡因子”(Balance Factor, BF)定義為BF(T)
平衡二叉樹(AVL樹)建立、查詢、插入操作 《大話資料結構》 c++實現程式碼
//平衡二叉樹,或者稱為AVL樹 #include<iostream> using namespace std; typedef int status; #define true 1 #define false 0 #define LH +1 //左高
C/C++實現平衡二叉樹的插入、刪除、查詢和各種遍歷
1 平衡二叉樹的插入 關於平衡二叉樹的定義什麼的,就不再多說。直接說說各種功能的c語言實現。 首先插入的時候需要進行旋轉以保證樹始終保持平衡。而旋轉的型別有四種:L-L型旋轉,L-R型旋轉,R-L型旋轉,R-R型旋轉。其中L-L型和R-R型只需要進行一次基本旋轉操作
AVL平衡二叉樹(c++實現)
#include <iostream> #include <algorithm> #include <stack> #include <vector> using namespace std; typedef
資料結構之 AVL樹(平衡二叉樹)(C語言實現)
AVL樹(平衡二叉樹) 1. AVL樹定義和性質 AVL(Adelson-Velskii和Landis發明者的首字母)樹時帶有平衡條件的二叉查詢樹。 二叉查詢樹的效能分析: 在一顆左右子樹高度平衡情況下,最優的時間複雜度為O(log2n),這與這半