数据结构 (树,图)



数据结构

二叉树
定义,最多有两个子节点
特点,每层节点数,总共节点数。
特殊的二叉树,满,完全,非完全
节点编号,根节点为1,完全二叉树特性
二叉树数组存储
二叉树链式存储结构
typedef struct node{
    int data;
    struct node * pLeft;
    struct node * pRight;
};

二叉树遍历,基于链式存储结构
递归遍历,按照访问根节点的顺序分3种:先,中,后
非递归遍历,
先跟遍历:先访问更节点,然后右节点入栈,左节点入栈,出栈一个,再右节点入栈,左节点入栈,这样循环
中根遍历,左子节点入栈,为空时开始出栈,访问出栈节点,按照递推规则访问右子节点。
层序遍历,根节点入队列,访问队列,在把节点的左右子节点入队列。

最优二叉树
定义:带权路径长度最小。带权路径长度是所有叶子节点的带权路径之和。
构造哈夫曼树:从n个叶子节点开始,构造一颗哈夫曼树。
存储结构:
typedef struct node{
    char ch;
    int parentIndex;
    int weight;
    int leftChild;
    int rightchild;
}HuffmanTree[2*n];

用数组结构来存放,前半部分存放叶子节点,后半部分存放中间节点。构造时根据父节点是否为空开判断这各节点是否已经被使用。

树和森林
几种表示方法
双亲,孩子,孩子兄弟


定义:点与连接点的边组成的集合。
分类:无向图,有向图,完全图
概念:度,出度,入度,路径
存储方式:
邻接矩阵
typedef struct node{
int index;
struct arc *pArc;
}Node[n];

typedef struct arc{
    int weight;
    int destNode;
    struct arc *pNextArc;
};
图的遍历,要有一个数组保存节点是否访问状态。
深度采用递归算法。
广度采用队列,类似树的层序遍历

最小生成树
普利姆算法
克鲁斯卡尔算法

AOV网络
拓扑排序:选入度为0的点,从图中删除这些点以及与之相邻的边,重复这个过程。
两种结果:可以选出所有的点,不能选出所有的点(存在回路的情况)
DAG图:不存在回路的图
AOE网络,带权
关键路径与关键活动




posted @ 2017-09-21 17:33  mingzhang  阅读(1055)  评论(0编辑  收藏  举报