首页 > 其他分享 >二叉树

二叉树

时间:2024-03-03 21:44:05浏览次数:22  
标签:Right BST GetHeight Element 二叉树 BinTree Left

记录

21:16 2024-3-3

1. 二叉树

1.二叉查找树(BST)

2.Treap

3.平衡二叉树(AVL)

先把自己当时学的时候写的放上来 reference:《数据结构与算法分析》
嘛,现在只能记得左旋右旋了(喝左旋哈哈哈)

点击查看代码
#define _CRT_SECURE_NO_WARNINGS    //vs中scanf为不安全的函数 要使用 得加上这句话
#include<stdio.h>
#include<malloc.h>
typedef struct TNode* BinTree;
typedef BinTree Position;
struct TNode
{
	int Element;
	BinTree Left;
	BinTree Right;
	int Heigth; //高度
};
int GetHeight(BinTree T)
{
	if (!T)
		return -1;
	else
		return T->Heigth;
}

int Max(int a, int b)
{
	return (a > b) ? a : b;
}
BinTree NewNode(int Element)
{
	BinTree T = (BinTree)malloc(sizeof(struct TNode));
	T->Element = Element;
	T->Left = NULL;
	T->Right = NULL;
	T->Heigth = 0;
	return T;
}
BinTree SingleLeftRotation(BinTree T)
{
	BinTree TL = T->Left;
	T->Left = TL->Right;
	TL->Right = T;
	T->Heigth = Max(GetHeight(T->Left), GetHeight(T->Right)) + 1;
	TL->Heigth = Max(GetHeight(TL->Left),T->Heigth)+1;
	return TL;
}
BinTree SingleRightRotation(BinTree T)
{
	BinTree TR = T->Right;
	T->Right = TR->Left;
	TR->Left = T;
	T->Heigth = Max(GetHeight(T->Left),GetHeight(T->Right))+1;
	TR->Heigth =Max(GetHeight(TR->Right),T->Heigth)+1;
	return TR;
}
BinTree DoubleLeftRightRotation(BinTree T)
{ //先做一次右单旋 再做一次左单旋
	T->Left = SingleRightRotation(T->Left);
	return SingleLeftRotation(T);
}
BinTree DoubleRightLeftRotation(BinTree T)
{//先做一次左旋 再做一次右旋
	T->Right = SingleLeftRotation(T->Right);
	return SingleRightRotation(T);
}
BinTree Insert(int Element, BinTree BST)
{
	if (!BST)       //BST为空 生成该节点 并且返回
		BST = NewNode(Element);
	else if (Element < BST->Element)
	{
			BST->Left = Insert(Element, BST->Left);   //递归插入左子树
			if (GetHeight(BST->Left) - GetHeight(BST->Right) == 2)    //判断是否需要进行旋转
				if (Element < BST->Left->Element)    //左单旋
					BST=SingleLeftRotation(BST);
				else
					BST=DoubleLeftRightRotation(BST);     //左-右双旋
	}
	else if (BST->Element < Element)
		{
			BST->Right = Insert(Element, BST->Right);  //递归插入右子树
			if (GetHeight(BST->Left) - GetHeight(BST->Right) == -2)
				if (Element > BST->Right->Element)    //右单旋
					BST=SingleRightRotation(BST);
				else
					BST=DoubleRightLeftRotation(BST);    //右-左双旋
		}
	BST->Heigth = Max(GetHeight(BST->Left), GetHeight(BST->Right)) + 1;
	return BST;
}
BinTree MakeTree()
{
	int N;
	scanf("%d",&N);
	int num;	
	scanf("%d", &num);
	BinTree T = NewNode(num);
	for (int i = 1; i < N; i++)
	{
		scanf("%d", &num);
		T=Insert(num, T);
	}
	return T;
}
int main()
{
	BinTree Root = MakeTree();
	printf("%d", Root->Element);
}

4.红黑树(red black tree)

标签:Right,BST,GetHeight,Element,二叉树,BinTree,Left
From: https://www.cnblogs.com/57one/p/18050786

相关文章

  • P1040 [NOIP2003 提高组] 加分二叉树
    原题链接题解计算分数是搜索存储前缀注意细节code#include<bits/stdc++.h>usingnamespacestd;#definelllonglongllsco[35][35]={0};stringpre[35][35];lla[35]={0};queue<ll>q;inlinevoidread(ll&x){x=0;llflag=1;charc=getch......
  • 线索二叉树
    线索二叉树即从前、中、后序三种遍历中其中一种来看,树中的左右孩子都不会是空着的,都会指向对应的前驱和后驱。以中序遍历为例,二叉树线索化过程如下:先是树的结构typedefstructThreadNode{Elemetypedata;structThreadNode*lchild,*rchild;intltag,rtag;}Th......
  • DFS在二叉树上的表现
    原题跳转:洛谷B3642二叉树的遍历题目内容:二叉树的遍历题目描述有一个\(n(n\le10^6)\)个结点的二叉树。给出每个结点的两个子结点编号(均不超过\(n\)),建立一棵二叉树(根节点的编号为\(1\)),如果是叶子结点,则输入00。建好树这棵二叉树之后,依次求出它的前序、中序、后序列遍......
  • 不同序构造二叉树
    一、根据前序与中序构造二叉树前序遍历:确定根节点root,最左端的节点即为根节点中序遍历:确定根节点左右两边的节点,通过计算左右两边节点集合的大小对root左节点集合与右节点集合执行重复操作,不断确定小集合的根节点,最终可构造出一整棵二叉树树的存储可以采用定义类或结构体,这......
  • 94. 二叉树的中序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidinorder(structTre......
  • 145. 二叉树的后序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidpostorder(structT......
  • 144. 二叉树的前序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidpreorder(structTr......
  • leedcode 二叉树的前序遍历
    递归法:classSolution:def__init__(self):#初始化一个实例变量res用于存储前序遍历结果self.res=[]defpreorderTraversal(self,root:Optional[TreeNode])->List[int]:#如果根节点存在ifroot:#检查根......
  • 平衡二叉树
    平衡二叉树特点:任意节点左右子树的高度不超过1反例:10节点的左子树高度为0,右子树高度为3这是平衡二叉树这也是平衡二叉树如何保持平衡添加一个节点后,该树不再是平衡二叉树-》旋转左旋,多余左节点做右节点复杂的左旋10的多余左节点9。给予前父节点7作为右节......
  • 二叉树查找树遍历
    二叉树查找树遍历存放规则:小的存左边、大的存右边、一样的不存前序、中序、后序指的是当前结点的顺序前序:当前结点、左子节点、右子节点中序:左子节点、当前节点、右子节点后序:左子节点、右子节点、当前结点前序遍历中左右遍历完左树遍历右树从上到下,根节点->从左......