1.堆(特殊的树)
(1)大顶堆:根结点最大,每个节点的值大于等于其孩子节点,用于升序(小->大)排列
(2)小顶堆:根结点最小,每个节点的值小于等于其孩子节点,用于降序(大->小)排列
(3) 相关操作
1)入队(堆):在最下面的叶子结点右边进行插入
(如果最下一层已满,就新增一层),
插入后若不再满足堆的特点,则需向上进行动态调整,直到满足
2)出队(堆):将根结点出队,再将最后1个结点放到根结点位置,
然后将新的根结点向下进行动态调整,直到满足堆特点
3)出队入队时间复杂度O(logn)
2.优先队列:不再遵循先进先出的原则,但必须有序
(1) 无论入堆顺序,每次都是当前最大/小的元素(即堆顶元素)出队
(2) 最大优先队列->最大堆;最小优先队列->最小堆
(3) 出队和入队时间复杂度O(logn)
原因:不管出队或入队,都有可能出现需要调整的情况,
而每次调整要做的比较都是在进行二分,即小于和大于情况
(4) 操作:
使用库函数实现,头文件<queue>
1)大顶堆(默认):priority_queue <队列中元素类型> 队列名;
小顶堆:(实现可将元素取负再入最大优先队列)
priority_queue <队列元素类型,vector<类型>,greater<类型>空格> 队列名;
如: priority_queue <int,vector<int>,greater<int> > q;
2)常用操作
q.push(x); 将x入堆 O(logn)
q.pop(); 将堆顶出队 O(logn)
q.top(); 获取堆顶元素(取而不删)O(1)
q.size(); 队列内元素个数 O(1)
q.empty()==1 队列为空(!q.empty()即不空)O(1)
1.二叉搜索树(二叉排序树),除非是空树,否则一定满足以下性质
1)左子树上节点的值均小于根节点;右子树上节点的值均大于根节点
2)任意结点的左,右子树也是二叉搜索树
3)没有值相同的结点
4)二叉搜索树的中序序列一定有序
5)同样的有序序列可以有不同的二叉搜索树
2.构造二叉搜索树(在二叉搜索树中插入值为x的结点 )
1)若根结点为空,则新建结点
2)若x<根结点值&&无左孩子,新建左孩子
3)若x>根结点值&&无右孩子,新建右孩子
4)若x<根结点值,左子树中重复以上操作
5)若x>根结点值,右子树中重复以上操作
3.查询二叉搜索树(查询第x小的数)
从根结点出发
1)若左子树结点个数len>=x,则查看其左子树
2)若左子树结点个数len+1==x,则第x小的数即为当前根结点
3)否则,k-=左子树结点个数len+1,继续搜索其右子树
2649

被折叠的 条评论
为什么被折叠?



