一、二叉树

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

二叉树节点声明:

 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. Android Studio使用第三方类库

    导入*.jar包 新建好了Android项目,添加一个第三方已经打包好的jar文件进你项目,下面就已添加一个odata4j的一个包 在项目中添加一个libs文件 直接通过COPY/PAST 把你下载的 ...

  2. CSS中margin和padding的区别

    在CSS中margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离.在CSS中padding是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离. 下面讲解 padding和ma ...

  3. css3 -- 网页字体

    1.@font-face规则 @font-face{ font-family:chunk; src:local('chunkFive'), url("chunkFive.ttf“) form ...

  4. MFC 启动其他程序 变相跳转

    尝试了多种方式之后都无法成功地在对话框程序中弹出一个单文档程序,然后我想到了这个办法. 如果直接在代码中实现某些窗口的弹出比较麻烦,可以采用这个方式来弹出这种窗口. 如果需要传递参数,只需将数据写入文 ...

  5. HDU5785 Interesting(Manacher + 延迟标记)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5785 Description Alice get a string S. She think ...

  6. Java类加载

    类的生命周期是: 在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM.在程序执行中JVM通过装载,链接,初始化这3个步骤完成. 类的装载是通过类加载器完成的,加载器将.c ...

  7. 翻译:让网络更快一些——最小化浏览器中的回流(reflow)

    关于reflowreflow(英音:[ri:’fləu] 美音:[ri’flo])在词典中的解释是回流,逆流.而在web应用中,翻译为回流有些牵强.我个人觉得,理解为回炉(重新塑形),似乎更加形象一点 ...

  8. Windows Phone 8 LongListSelector实现下拉自动刷新列表

    LongListSelector是一个加强版的列表控件,它可以实现分组的列表,如系统人脉列表的交互效果就可以利用LongListSelector控件去实现,同时LongListSelector也一样可 ...

  9. 【BZOJ】1975: [Sdoi2010]魔法猪学院

    题意 \(n(2 \le n \le 5000)\)个点,找尽量多的不同\(1\)到\(n\)的路径,每一次的花费就是路径的全值和,要求在费用不超过\(E\)的情况下路径最多. 分析 裸的最段路. 题 ...

  10. 【BZOJ】2194: 快速傅立叶之二

    http://www.lydsy.com/JudgeOnline/problem.php?id=2194 题意:求$c[k]=\sum_{k<=i<n} a[i]b[i-k], n< ...