平衡二叉树

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

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

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

//
// 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. Install Redis 3.2 on Ubuntu

    Install Redis 3.2 on Ubuntu It’s very easy to install Redis 3 on Ubuntu 16, just need to add PPA rep ...

  2. activiti自己定义流程之整合(四):整合自己定义表单部署流程定义

    综合前几篇博文内容.我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功. 正由于如此,在创建了流程 ...

  3. 二叉树遍历-c实现

    这里主要是三种遍历,先序(preorder,NLR),中序(Inorder,LNR),后序(Postorder,LRN) N:node,L:left,R:right 基本排序:先序(NLR,节点,左, ...

  4. MSSQL数据导出到MYSQL

    MSSQL数据导出到MYSQL 花了一天时间把MSSQL里的数据导出到MYSQL, 好麻烦,二个数据库都是阿里云买的云服务器. 先上阿里云控制面板,备份下MSSQL数据库,下载备份下来,在本地电脑上还 ...

  5. django聚合查询

    聚合¶ Django 数据库抽象API 描述了使用Django 查询来增删查改单个对象的方法.然而,有时候你需要获取的值需要根据一组对象聚合后才能得到.这份指南描述通过Django 查询来生成和返回聚 ...

  6. 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...

  7. SparkStreaming基本架构及使用

    1.简介 Spark Streaming处理的数据流图: Spark Streaming在内部的处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处 ...

  8. 运行yarn的时候提示 node不是内部或外部命令

    背景:准备react native 搭建,装完nodejs  npm 重启cmd,再次管理员运行即可!

  9. Spark基础

    1 读取本地文件 ./spark-shell scala> val textFile=sc.textFile("file:///home/hadoop/wordfile1.txt&qu ...

  10. openwrt官方固件怎么中继网络

    关键一点,取消勾