平衡二叉树

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

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

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

//
// 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. [C#] 解决Silverlight反射安全关键(SecuritySafeCritical)时报“System.MethodAccessException: 安全透明方法 XXX 无法使用反射访问”的问题

    作者: zyl910 一.缘由 在Silverlight中使用反射动态访问时,经常遇到"System.MethodAccessException: 安全透明方法 XXX 无法使用反射访问-- ...

  2. git图解

  3. centos7下docker二进制安装

    问题描述: 内网离线环境下,安装docker.二进制来的还是快点,或者内网搭建yum的epel仓库! 环境: centos7.x docker-18.9.0 x86_64  static //二进制 ...

  4. Django表单介绍

    HTML 表单 在HTML中,表单是<form>...</form> 之间元素的集合,它们允许访问者输入文本.选择选项.操作对象和控制等等,然后将信息发送回服务器. 某些表单的 ...

  5. 基于R语言的ARIMA模型

    A IMA模型是一种著名的时间序列预测方法,主要是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型.ARIMA模型根据原序列是否平稳以及 ...

  6. 【RS】Collaborative Memory Network for Recommendation Systems - 基于协同记忆网络的推荐系统

    [论文标题]Collaborative Memory Network for Recommendation Systems    (SIGIR'18) [论文作者]—Travis Ebesu (San ...

  7. PHP-问题处理Fatal error: Uncaught Error: Call to undefined function mb_strlen()

    1.问题 今天重新安装了ubuntu,PHP,MySQL,Apache,到测试CMS项目时发生一个错误: Fatal error: Uncaught Error: Call to undefined ...

  8. Navicat Premium 12破解方法

    来源网址:https://www.jianshu.com/p/42a33b0dda9c 1.按步骤安装Navicat Premium,如果没有可以去官网下载:http://www.navicat.co ...

  9. fiddler的编程文章

    https://www.cnblogs.com/trevan/p/9487223.html https://www.cnblogs.com/rufus-hua/p/5275980.html https ...

  10. python按行遍历一个大文件,最优的语法应该是什么?

    理论上来说,总体上file.readlines()可以(取决于实现)不慢于你自己手动的一次次调用file.readline(),因为前者的循环在C语言层面,而你的循环是在Python语言层面. 但是在 ...