平衡二叉树

左旋,右旋,左右旋,右左旋

具体原理就不说了,网上教程很多。这里只实现了建树的过程,没有实现删除节点的操作。

下一篇会实现删除节点的操作。

//
// main.cpp
// AVL
//
// Created by 小康 on 2019/3/30.
// Copyright © 2019 小康. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h> using namespace std; struct Tree
{
Tree* leftChild;
Tree* rightChild;
int key;
int value;
int leftHeight;
int rightHeight;
}; int num;
void LeftSpin(Tree*& root)
{
Tree* temp = root;
Tree* temp2 = root->rightChild->leftChild;
root = temp->rightChild;
root->leftChild = temp;
temp->rightChild = temp2; root->leftChild->rightHeight = root->leftChild->rightChild==NULL?:max(root->leftChild->rightChild->leftHeight,root->leftChild->rightChild->rightHeight)+; root->leftHeight = max(root->leftChild->leftHeight,root->leftChild->rightHeight)+;
} void RightSpin(Tree*& root)
{
Tree* temp = root;
Tree* temp2 = root->leftChild->rightChild; root = temp->leftChild;
root->rightChild = temp;
temp->leftChild = temp2; root->rightChild->leftHeight =root->rightChild->leftChild==NULL?:max(root->rightChild->leftChild->leftHeight,root->rightChild->leftChild->rightHeight)+;
root->rightHeight = max(root->rightChild->leftHeight,root->rightChild->rightHeight)+;
} void LeftRightSpin(Tree*& root)
{
LeftSpin(root->leftChild);
RightSpin(root);
} void RightLeftSpin(Tree*& root)
{
RightSpin(root->rightChild);
LeftSpin(root);
} void Insert(Tree*& root,int key,int value)
{
if(root==NULL)
{
root = new Tree;
root->leftChild=NULL;
root->rightChild=NULL;
root->key = key;
root->value = value;
root->leftHeight = ;
root->rightHeight = ;
return;
} if(key < root->key)
{
Insert(root->leftChild,key,value);
root->leftHeight = max(root->leftChild->leftHeight,root->leftChild->rightHeight)+;
if(root->leftHeight > root->rightHeight+)
{
if(root->leftChild ->leftHeight > root->leftChild->rightHeight)
{
RightSpin(root);
}
else if(root->leftChild->leftHeight < root->leftChild->rightHeight)
{
LeftRightSpin(root);
}
}
}
else{
Insert(root->rightChild, key,value);
root->rightHeight = max(root->rightChild->leftHeight,root->rightChild->rightHeight)+; if(root->leftHeight<root->rightHeight-)
{
if(root->rightChild->rightHeight > root->rightChild->leftHeight)
{
LeftSpin(root);
}
else if(root->rightChild->rightHeight<root->rightChild->leftHeight)
{
RightLeftSpin(root);
}
}
}
} int Get(Tree* root,int key)
{
if(key<root->key)
{
return Get(root->leftChild,key);
}
if(key>root->key)
{
return Get(root->rightChild,key);
} return root->value; } int main()
{ Tree* root = NULL ; Insert(root, , );
Insert(root, , );
Insert(root, , );
Insert(root, , );
printf("%d",Get(root,));
printf("%d",Get(root,));
printf("%d",Get(root,));
//Insert(root, 4, 5); return ;
}

手写AVL 树(上)的更多相关文章

  1. 手写AVL 树(下)

    上一篇 手写AVL树上实现了AVL树的插入和查询 上代码: 头文件:AVL.h #include <iostream> template<typename T1,typename T ...

  2. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

  3. AVL树的理解及自写AVL树

    AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...

  4. Android+TensorFlow+CNN+MNIST 手写数字识别实现

    Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...

  5. 用BP人工神经网络识别手写数字

    http://wenku.baidu.com/link?url=HQ-5tZCXBQ3uwPZQECHkMCtursKIpglboBHq416N-q2WZupkNNH3Gv4vtEHyPULezDb5 ...

  6. 一步一步写平衡二叉树(AVL树)

    平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...

  7. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  8. JDK动态代理深入理解分析并手写简易JDK动态代理(上)

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-03/27.html 作者:夜月归途 出处:http://www.guitu ...

  9. django 常用方法总结 < 手写分页-上传头像-redis缓存,排行 ...>

    1.不使用自带模块<Paginator>的手写分页功能views.pydef post_list(request): page = request.GET.get('page', 1) # ...

随机推荐

  1. Docker中部署Mysql5.7和DbAdmin的docker-compose.yml

    一.简述 本文讲Docker通过docker-compose.yml部署Mysql5.7和dbAdmin的方法. 二.文件 1.docker-compose.yml内容如下: version: ' s ...

  2. 尝试新的构造系统 Ninja

    Ninja 是 Chrome 项目的构建工具,用来替换经典工具 make,目前这个开源工具已经被很多其它项目采用.据项目作者描述,创建这个新的构建工具,主要是为了提升大型项目的编译速度. 由于 Nin ...

  3. 【C语言天天练(三)】typedef具体解释

    引言: typedef能够看作type define的缩写,顾名思义就是类型定义,也就是说它仅仅是给已有的类型又一次定义了一个方便使用的别名.并没有产生新的数据类型. typedef与define的不 ...

  4. asp.net中 使用参数化mysqlparameter 保存数据时,总保存成一个汉字的解决方案。

    var param = new MySqlParameter("@" + columName, property.Value); param.DbType = DbType.Str ...

  5. 创建一个Django项目的基本步骤

    创建一个Django 的常规步骤 1.寻找一个磁盘目录,比如 e: 2.django-admin startproject ops 3.cd ops 4.python manage.py starta ...

  6. Metadata GC Threshold导致的full gc分析

    gc log 两次full gc 均是Metadata GC导致, OpenJDK -Bit Server VM ( :: by (Red Hat -) Memory: 4k page, physic ...

  7. animate.css做点赞效果

    花了一晚上研究出来的,感觉还行吧... 代码: 源码下载: http://image.niunan.net/animatedemo.zip

  8. 星云STS 常用配置

    STS4  下载地址:https://spring.io/tools    (这个版本没有tomcat插件) STS3  下载地址:https://spring.io/tools3/sts/all ( ...

  9. 你可能不知道的IDEA高级调试技巧

    一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可 ...

  10. 关于.NET编译的目标平台(AnyCPU,x86,x64) (转)

    关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . ...