tan90dx

排序算法:堆排序
树在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有...
扫描右侧二维码阅读全文
21
2019/04

排序算法:堆排序

在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个节点都只有有限个子节点或无子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
树里面没有环路(cycle)
树-维基百科,自由的百科全书

由The original uploader was 中文维基百科的Samuel. - Transferred from zh.wikipedia to Commons by Shizhao using CommonsHelper.,CC BY-SA 3.0

二叉树

如果一个树,每个节点最多只有两个分支,那么这个树叫做二叉树,其中其左边的树叫做左子树,右边的叫做右子树
求二叉树

树的储存方式:数组


从上到下依次编号作为数组下标。
求二叉树某一节点子树方法:
左子树:2i+1
右子树:2i+2
求某一节点父节点的方法:(i-1)/2(整数除法)

树的遍历方式

我们可以将序替换成根,方便记忆。

先序(根)遍历

顺序:先访问根,然后访问子树

由The original uploader was 中文维基百科的Samuel. - Transferred from zh.wikipedia to Commons by Shizhao using CommonsHelper.,CC BY-SA 3.0
F->B->A->D->C->E->G->I->H

中序(根)遍历

顺序:先访问左(右)子树,然后访问根,最后访问右(左)子树

由Sorted_binary_tree.svg: Milesderivative work: Pluke (talk) - Sorted_binary_tree.svg,公有领域
A->B->C->D->E->F->G->I->H

后序(根)遍历

先访问子树,然后访问根

A->C->E->D->B->H->I->G->F

代码实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct print
{
    void operator()(int n)//定义用于打印的一元谓词
    {
        cout << n << " ";
    }
};
void prttree_xx(vector<int>tree,int index)//先序遍历
{
    if (index >= tree.size())return;//递归出口
    cout << tree[index]<<" ";//打印根节点
    prttree_xx(tree, 2 * index + 1);//打印左节点
    prttree_xx(tree, 2 * index + 2);//打印右节点
}
void prttree_zx(vector<int>tree, int index)//中序遍历
{
    if (index >= tree.size())return;//递归出口
    prttree_zx(tree, 2 * index + 1);//打印左节点
    cout << tree[index] << " ";//打印根节点
    prttree_zx(tree, 2 * index + 2);//打印右节点
}
void prttree_hx(vector<int>tree, int index)//中序遍历
{
    if (index >= tree.size())return;//递归出口
    prttree_hx(tree, 2 * index + 1);//打印左节点
    prttree_hx(tree, 2 * index + 2);//打印右节点
    cout << tree[index] << " ";//打印根节点
    
}
int main()
 {
    vector<int>tree{78,56,34,43,4,1,15,2,23};
    prttree_xx(tree, 0);
    cout << endl;
    prttree_zx(tree, 0);
    cout << endl;
    prttree_hx(tree, 0);
    cout << endl;
}

运行结果

完全二叉树

除了尾节点,每个节点都完整拥有两个节点的树

近似完全二叉树

近似完全二叉树是完全二叉树缺少一部分,但是不能乱缺少,缺少的前提是其左边是满的。
emmm,不知道如何解释,上图吧。

堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的母节点,那么 P 的值会小于等于(或大于等于) C 的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作根节点(root node),根节点本身没有母节点(parent node)。
堆-维基百科,自由的百科全书

简单的来说一个堆是完全二叉树或者近似完全二叉树,但是除此之外还需要满足两个条件
-父节点的键值大于小于或者等于所有的子节点的键值
-每个节点的左右子树都是一个二叉堆(最大或者最小堆)

最大堆和最小堆的概念

-任意节点的值都大于其子节点的值--->大顶堆
-任意节点的值都小于其子节点的值--->小顶堆

堆排序


1,堆化:反向调整使得每个子树都是大顶堆,或者小顶堆
2.按序输出元素:

尚未写完,等一下哟

最后修改:2019 年 05 月 29 日 04 : 00 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论