二叉树-二叉查找树-AVL树-遍历
一、二叉树
定义:每个节点都不能有多于两个的儿子的树。
二叉树节点声明:
struct treeNode
{
elementType element;
treeNode * left;
treeNode * right;
}
应用:
中缀表达式——>后缀表达式(栈的应用)——>表达式树(栈的应用2)
栈的应用2:读取后缀表达式,操作数入栈,遇操作符后,指向栈里前两位元素t1和t2的指针出栈(t1先弹出,作为该操作符的右儿子),并将指向该操作符的指针入栈。
二、二叉查找树
定义:
结构性:二叉树;
排序性:右子树中最小值 > X关键字 > 左子树中最大值(对任意节点关键字X均成立)
1、清空树(递归)makeEmpty
searchTree * makeEmpty( searchTree * T)
{
if( T != NULL)
{
makeEmpty( T -> left);
makeEmpty( T -> right);
delete (T); // 基准情况
}
return T;
}
2、Find
searchTree * find( elementType X , searchTree * T)
{
if( T = NULL)
return NULL; //非空判断 if(X < T->element)
return find (X , T->left);
else
if(X > T->element)
return find(X , T->right);
else
return T; //找到元素X
}
3、findMin && findMax(举一例,(非)递归法,利用其排序性找到相应节点)
递归法:
searchTree * findMax( searchTree * T)
{
if( T = NULL)
return NULL; //非空判断
else
if(T->right == NULL)
return T; //基准情况
else
return findMax(T->right);
}
非递归法:
searchTree * findMax( searchTree * T)
{
if( T = NULL)
return NULL; //非空判断
else
while(T->right != NULL)
T = T->right;
return T;
}
4、insert
searchTree * insert( elementType X , searchTree * T)
{
if( T == NULL)
{
T = searchTree New(searchTree);
if(T == NULL)
cout << "out of space." << endl;
else
{
T->element = X;
T->left = T->right = NULL;
}
}
else
if(X < T->element)
T->left = insert(X , T->left);
else
if(X > T->element)
T->right = insert(X , T->right); return T;
}
5、delete
searchTree * delete( elementType X , searchTree * T)
{
searchTree * tem;
tem = (searchTree *) New searchTree;
if( T == NULL)
return NULL;
else
if(X < T->element)
T->left = delete(X , T->left);
else
if(X > T->element)
T->right = delete(X , T->right);
else
if(T->left && T->right)
{
tem = findMin(T->right);
T->element = tem->element;
// tem = delete(tem->element , tem);
T->right = delete(T->element , T->right);
}
else
{
tem = T;
if(T->left == NULL)
T = T->right;
if(T->right == NULL)
T = T->left;
delete(tem);
}
return T;
}
三、AVL树
定义:每个节点的左子树和右子树的高度最多差1的二叉查找树。(空树的高度定义为-1)
插入后,只有那些从 插入点 到 根节点 的路径上的节点的平衡可能被改变,所以沿着 插入点 回溯到 根节点的这条路径并更新平衡信息,就可以找到破坏AVL平衡条件的节点。
(第一个这样的节点 即破坏性节点中最深的节点)。
破坏平衡性的节点设为a,则a的左右子树高度差为2,新节点插入点:
1、a的左儿子的左子树(单旋转)
2、a的左儿子的右子树(双旋转)
3、a的右儿子的左子树(单旋转)
4、a的右儿子的右子树(双旋转)
1、节点声明
struct avlNode
{
elementType element;
avlNode left;
avlNode right;
int height;
}
2、高度信息
static int height( avlNode *P)
{
if( P == NULL)
return -; //基准情况
else
return max( height(P->left) , height(P->right) ) + ;
}
3、节点插入
avlTree *insert(elementType X , avlTree *T)
{
if(T == NULL)
{
T = (avlTree*) New avlTree;
if(T == NULL)
cout << "out of space" << endl;
else
{
T->element = X;
T->left = T->right = NULL;
}
}
else
if(X < T->element)
{
T->left = insert (X , T->left);
if(height(T->left) - height(T->right) == )
{
if(X < T->left->element)
T = singleRotateWithLeft(T);
else
T = doubleRotateWithLeft(T);
}
}
else
if(X > T->element)
{
T->right = insert (X , T->right);
if(height(T->right) - height(T->left) == )
{
if(X > T->right->element)
T = singleRotateWithRight(T);
else
T = doubleRotateWithRight(T);
}
}
T->height = height(T); //更新高度信息
return T;
}
4、旋转(给出一组单双旋转)
static avlTree *singleRotateWithLeft(avlTree *T1)
{
avlTree *T2;
T2 = T1->left; T1->left = T2->right;
T2->right = T1;
T1->height = height(T1); //更新高度信息
T2->height = height(T2); return T2;
}
static avlTree *doubleRotateWithLeft(avlTree *T1)
{
T1->left = singleRotateWithRight(T1->left);
// 在旋转中已经有返回值,此时不写return亦可
rerurn singleRotateWithLeft(T1);
}
四、树的遍历(递归)
中序遍历:左-中-右
后序遍历:左-右-中(先遍历儿子)
前序遍历:中-左-右(先遍历祖先)
中序遍历:
void printTree(searchTree *T)
{
if(T != NULL)
{
printTree(T->left);
cout<< T->element << endl;
printTree(T->right);
}
}
二叉树-二叉查找树-AVL树-遍历的更多相关文章
- 二叉树与AVL树
二叉树 什么是二叉树? 父节点至多只有两个子树的树形结构成为二叉树.如下图所示,图1不是二叉树,图2是一棵二叉树. 图1 普通的树 ...
- 二叉树,AVL树和红黑树
为了接下来能更好的学习TreeMap和TreeSet,讲解一下二叉树,AVL树和红黑树. 1. 二叉查找树 2. AVL树 2.1. 树旋转 2.1.1. 左旋和右旋 2.1.2. 左左,右右,左右, ...
- 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树
一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...
- python常用算法(5)——树,二叉树与AVL树
1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- 5分钟了解二叉树之AVL树
转载请注明出处:https://www.cnblogs.com/morningli/p/16033733.html AVL树是带有平衡条件的二叉查找树,其每个节点的左子树和右子树的高度最多相差1.为了 ...
- 二叉树之AVL树
高度为 h 的 AVL 树,节点数 N 最多2^h − 1: 最少N(h)=N(h− 1) +N(h− 2) + 1. 最少节点数n 如以斐波那契数列可以用数学归纳法证明: 即: N(0) = 0 ( ...
- 二叉树之AVL树的平衡实现(递归与非递归)
这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...
- 面试题:什么叫平衡二叉查找树--AVL树
查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...
- Avl树的基本操作(c语言实现)
#include<stdio.h> #include<stdlib.h> typedef struct AvlNode *Position; typedef struct Av ...
随机推荐
- AchartEngine的柱状图属性设置
1. 修改背景色或设置背景图片 背景色设置需要设置两项:setMarginsColor(设置四边颜色)以及setBackgroundColor(设置中间背景色) 设置背景图片: ...
- 指针数组 vs 数组指针
指针数组,故名思义,就是指针的数组,数组的元素是指针: 数组指针,同样,就是直想数组的指针. 简单举例说明: int *p[2]; 首先声明了一个数组,数组的元素是in ...
- java&Protocol Buffers
ps: Protocol Buffers简称PB PB 安装配置 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 P ...
- Angular JS 学习之Http
1.$http是AngularJS中的一个核心服务,用于读取远程服务器的数据: 2.读取JSON文件: **JSON文件如下: { "sites":[ { "Name&q ...
- 仓库如何盘点 打印扫描一体PDA盘点机提升库存盘点效率
仓库盘点是对仓储货品的收发结存等活动进行有效控制,保证仓储货品完好无损.帐物相符,确保生产正常进行,规范公司物料的盘点作业.盘点需人工操作,费时费力,PDA盘点机的出现大幅提升了盘点效率,减轻了工作人 ...
- ajax无刷新异步传输
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- iOS socket TCP UDP
TCP: 服务器: #import <Foundation/Foundation.h> #include <sys/socket.h> #include <netinet ...
- iris数据集
iris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,是在数据挖掘.数据分类中非常常用的测试集.训练集. 链接地址
- <构建之法>3-5章感想
提示:(下面的总结我会按照每章发现的问题,自己的回答,感想来陈述) 3章. 在阅读3.2.4职业成长-自我评估的时候,说到CRUD需要一些核心技术和许多控扩展的知识,那么作为软件工程的学生,在学校除了 ...
- Android LruCache(Picasso内存缓存)
Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部,当cache已满的时候加入新的item时,在队列尾部的item会被回收. 如果你cache的某个值需要 ...