DS:AVL树

找到一个数据结构可视化网站:
https://visualgo.net/zh
也太甜美了叭~

昨天预习了AVL树,今天课上写好了作业😃
感谢邓老师5555
到今天二叉树就学的差不多了,先总结一下:

二叉树及其延伸

完全二叉树:上面都满,只有最后一层可以从右往左缺结点
二叉搜索/排序树:中序遍历为升序序列
二叉线索树:ltag,rtag指示中序的前驱和后继
Huffman树:最小外部节点路径,用于压缩存储
AVL树:二叉搜索树+二叉平衡树,旋转操作

还有不学的红黑树、B树等,立个flag,清完DDL做一下拓展了解


还要总结一下本周作业
1.
AVL树高度为h,则其最小结点数可由递推公式得到:
N(0)=0
N(1)=1
N(h)=N(h-1)+N(h-2)+1
AVL树结点数为n,则其最大高度为:
⌊1.44*log2(n+2)-1⌋(并不知道怎么来的hhh)
最小高度为:
⌊log2(n)⌋(这个其实和二叉树是一样的)
2.
AVL树的插入、查找、删除时间复杂度都为O(log2n)

寻找第K小的结点

思路:先找到最小结点(这个很好找,就是最左下的那个),然后寻找k-1个中序后继

template <class E, class K>
struct AVLNode{
        int bf;K data;
AVLNode<E,K> *lchild,*rchild;
        AVLNode ( ) : {bf=0;lchild=NULL;rchild=NULL;}
};//AVL树结点

template <class E, class K>
class AVLTree {
public:	
    K Kmin(int k, AVLNode<E,K> *root);//寻找第k小元素
   AVLNode<E, K> *min( AVLNode<E, K> *root);//寻找最小结点
   AVLNode<E, K> *succ( AVLNode<E, K> *root,AVLTree<E,K> tree);//寻找中序后继
AVLNode<E, K> *parent( AVLNode<E, K> *root,AVLTree<E,K> tree);//寻找结点双亲
}//AVL树

template<class E,class K>
AVLNode<E,K> * AVLTree<E,K> :: min(AVLNode<E,K> *root)
{if(root==NULL) return NULL;
while(root->lchild!=NULL) root=root->lchild;//向左孩子前进直到叶子结点(即为最小结点)
return root;}//寻找当前子树的最小结点

template<class E,class K>
AVLNode<E,K> *AVLTree<E,K> :: parent(AVLNode<E,K> *p,AVLTree<E,K> tree)
{AVLNode<E,K> root=tree.root;
 while(root->lchild!=p && root->rchild!=p)
{if(root->data>p->data) root=root->lchild;//根据关键字大小搜索
else root=root->rchild;}
return root;}//寻找指定结点的双亲

template<class E,class K>
AVLNode<E,K> *AVLTree<E,K> :: succ(AVLNode<E,K> *root,AVLTree<E,K> tree)
{if(root==NULL)return NULL;
else if(root->rchild!=NULL) return min(root->rchild);//若指定结点有右孩子,则其后继为右子树的中序第一个结点
else {AVLNode<E,K> *p=parent(root,tree);
while(root==p->rchild&&p!=NULL)
{root=p;p=parent(p,tree);}//否则从根开始搜索,直到找到中序后继
return p;}
}//寻找指定结点的中序后继

template<class E,class K>
K AVLTree<E,K> :: Kmin(int k,AVLNode<E,K> *root)
{AVLNode *p=min(root);//先找到整棵树最小结点
int i=1;
for(;i<k;i++) p=succ(p);//寻找最小结点的第K-1个后继
return p->data;
}//寻找第K小的元素

只写了算法没跑过代码…现在debug真是头疼😭

判断二叉树是否AVL树

只要判断是否二叉搜索树+二叉平衡树就好啦
二叉平衡树就计算左右子树高度判断
一开始觉得二叉搜索树很麻烦,其实要紧扣本质啊,每个结点都符合条件就可以啦~

template <typename T>
class BinTreeNode
{
public:
    BinTreeNode(){lchild=NULL;rchild=NULL;}
    T data;
    BinTreeNode *lchild, *rchild;
    BinTreeNode(const T&t):data(t),lchild(NULL),rchild(NULL){}
};//二叉树结点

template <typename T>
class BinTree
{
public:
    BinTree(){root->lchild=NULL;root->rchild=NULL;}
    BinTreeNode<T> *root;
    int height (BinTreeNode<T> *root);
bool isAVL(BinTreeNode<T> *root, BinTree<T> tree);
};//二叉树
template<typename T>
int BinTree<T>::height (BinTreeNode<T> *root) {
    if (root== NULL ) return 0;    
else {
        int i = height ( root->lchild );
        int j = height ( root->rchild );
        return (i<j)?j+1:i+1;
    }
}//求子树高度

template<typename T>
bool BinTree<T>::isAVL(BinTreeNode<T> *root,BinTree<T> tree){
if(root==NULL) return true;//空树或空结点
if(root->data < root->lchild->data || root->data > root->rchild->data)  return false;//判断当前结点是否满足BST条件
if(abs(height(root->lchild)-height(root->rchild))>=2)
return false;//若左右子树高度差的绝对值>=2,则不为AVL树
else {tree.isAVL(root->lchild,tree);//继续判断左子树
tree.isAVL(root->rchild,tree);//继续判断右子树
return true;}
}//判断是否AVL树

一样没跑过,现在觉得大部分时间都花在了找(写)bug上

二叉树差不多学完啦,其实觉得还蛮有意思的(debug就不有趣了hhh)
感悟就是二叉树一样要可视化,要自己动手画理解思路,或者用可视化网站去看它的变化过程,并且思考为什么要做这样的优化
以及另一句感悟:“不要拿你的冬天比较别人的春天”
好啦,继续冲冲冲!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值