一、二叉树

定义:每个节点都不能有多于两个的儿子的树。

二叉树节点声明:

 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树-遍历的更多相关文章

  1. 二叉树与AVL树

    二叉树 什么是二叉树? 父节点至多只有两个子树的树形结构成为二叉树.如下图所示,图1不是二叉树,图2是一棵二叉树. 图1 普通的树                                    ...

  2. 二叉树,AVL树和红黑树

    为了接下来能更好的学习TreeMap和TreeSet,讲解一下二叉树,AVL树和红黑树. 1. 二叉查找树 2. AVL树 2.1. 树旋转 2.1.1. 左旋和右旋 2.1.2. 左左,右右,左右, ...

  3. 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树

    一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...

  4. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  5. 5分钟了解二叉树之AVL树

    转载请注明出处:https://www.cnblogs.com/morningli/p/16033733.html AVL树是带有平衡条件的二叉查找树,其每个节点的左子树和右子树的高度最多相差1.为了 ...

  6. 二叉树之AVL树

    高度为 h 的 AVL 树,节点数 N 最多2^h − 1: 最少N(h)=N(h− 1) +N(h− 2) + 1. 最少节点数n 如以斐波那契数列可以用数学归纳法证明: 即: N(0) = 0 ( ...

  7. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

  8. 面试题:什么叫平衡二叉查找树--AVL树

    查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...

  9. Avl树的基本操作(c语言实现)

    #include<stdio.h> #include<stdlib.h> typedef struct AvlNode *Position; typedef struct Av ...

随机推荐

  1. AchartEngine的柱状图属性设置

    1.      修改背景色或设置背景图片 背景色设置需要设置两项:setMarginsColor(设置四边颜色)以及setBackgroundColor(设置中间背景色) 设置背景图片:        ...

  2. 指针数组 vs 数组指针

        指针数组,故名思义,就是指针的数组,数组的元素是指针:     数组指针,同样,就是直想数组的指针.     简单举例说明:     int *p[2]; 首先声明了一个数组,数组的元素是in ...

  3. java&Protocol Buffers

    ps: Protocol Buffers简称PB PB 安装配置 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 P ...

  4. Angular JS 学习之Http

    1.$http是AngularJS中的一个核心服务,用于读取远程服务器的数据: 2.读取JSON文件: **JSON文件如下: { "sites":[ { "Name&q ...

  5. 仓库如何盘点 打印扫描一体PDA盘点机提升库存盘点效率

    仓库盘点是对仓储货品的收发结存等活动进行有效控制,保证仓储货品完好无损.帐物相符,确保生产正常进行,规范公司物料的盘点作业.盘点需人工操作,费时费力,PDA盘点机的出现大幅提升了盘点效率,减轻了工作人 ...

  6. ajax无刷新异步传输

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. iOS socket TCP UDP

    TCP: 服务器: #import <Foundation/Foundation.h> #include <sys/socket.h> #include <netinet ...

  8. iris数据集

    iris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,是在数据挖掘.数据分类中非常常用的测试集.训练集. 链接地址

  9. <构建之法>3-5章感想

    提示:(下面的总结我会按照每章发现的问题,自己的回答,感想来陈述) 3章. 在阅读3.2.4职业成长-自我评估的时候,说到CRUD需要一些核心技术和许多控扩展的知识,那么作为软件工程的学生,在学校除了 ...

  10. Android LruCache(Picasso内存缓存)

    Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部,当cache已满的时候加入新的item时,在队列尾部的item会被回收. 如果你cache的某个值需要 ...