1. 程式人生 > >平衡二叉樹C++模板

平衡二叉樹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),這與這半