【数据结构笔记】四、树的应用

来源:互联网 发布:好用的网络电话软件 编辑:程序博客网 时间:2024/05/17 18:17

树的应用按考纲来看的话:
1.二叉排序树
2.堆结构
3.哈夫曼(Huffman)树和哈夫曼编码
而刚好这节课刚好都讲到了。
首先,先讲
二叉排序树
也叫二叉查找树/二叉搜索树 BST,Binary Search Tree
主要特性是:左<中<右
一些用的到的特殊函数:
①Position Find(Elemtype X,BinTree BST)
//查找值为X的位置,返回地址
这里用尾递归(可用循环实现),其查找效率取决于树的高度,当出现斜二叉树时是效率很差的情况。解决方法:平衡二叉树(后面讲)
②Position FindMin(BinTree BST)
主要实现是不断往左递归(循环也可实现)
③Position FindMax(BinTree BST)
往右不断递归
④BinTree Insert(Elemtype X,BinTree BST)
//插入,注意仍保持二叉排序树的特性:左<中<右
eg 十二个月份按字典序插入
eg BST->Right = Insert(X,BST->Right);
例子中递归返回的树妖赋值给其右子树,即记录下插入位置
⑤BinTree Delete(Elemtype X,BinTree BST)
//删除比较麻烦,先查找后删除,根据结点不同分三种情况
(1)删叶结点
(2)有一个儿子的结点:让父亲->孙子
(3)有左右两个儿子的结点:两种方案实现,一是 右子树找个最小的来代替,并记得再递归删掉那个结点;二是 左子树里找个最大的来代替,并递归删掉那个结点。
因为是最值,一定只有一个儿子,可以转至(2)(1)。
例子中和插入一样,删除的位置要记录,因此
BST->Right = Insert(X,BST->Right);有类似这样的表示
平衡二叉树
AVL树 Balanced Binary Tree
上面说到我么为了提高查找效率,引入平衡二叉树的概念,其根本是为了降低树的高度,最好是降到log2N。
因此我们让左右结点、高度相差尽量低。
引入平衡因子balance fator的概念BF(T)=h左-h右
每个结点,注意是每个BF的绝对值<=1,或本身是个空树即是AVL树。
高度为h的AVL树最少有几个结点呢?列举可以发现一个规律n(h)=n(h-1)+n(h-2)+1,我们想到斐波那契数列,因此算出nh的值,得出其复杂度。
n个结点AVL树的查找效率是log2n。
AVL树的调整
我们要将不平衡->平衡,本质还是个二叉排序树,注意保持左<中<右的特点成立
这里算个难点,分为四种
1.右单旋(RR旋转) 麻烦结点在右子树的右子树的下面(接在左右都可)
2.左单旋(LL旋转)麻烦结点在左子树的左子树的下面
3.LR旋转 麻烦结点在左子树的右子树的下面
4.RL旋转 麻烦结点在右子树的左子树的下面
堆&哈夫曼部分近期更新

思考:
1. 关于AVL树的调整,感觉自己只是知其然,大概知道怎么调整,不知道考试的深度是怎么样,考的有多细,mark下吧,过下一遍再看下
2. 老师给的讨论题 AVL树能否用两边的结点树差来定义呢?貌似挺复杂的,大家可以想一想

原创粉丝点击