数据结构-最小生成树的实现

数据结构-最小生成树的实现
数据结构-最小生成树的实现

// mygraph2.cpp : Defines the entry point for the console application.

//

/*

题目:用邻接表的形式表示图。最小生成树

编译器:visualc++ 6.0

参考资料:《数据结构(用面向对象方法与c++语言描述)》

尚未处理的边放在最小堆中,通过并査集的find运算,可以很快的判断任意一条边的两个端点是否来自同一个联通分量,

是就舍去,不是就留下,通过并査集的union运算,将两棵树合二为一,直到成了一棵树

P262-266并査集实现

P235-239最小堆的实现

P349-P350 图的模板基类

P355-P356 用邻接表表示图

P364-P366 图的广度优先和深度优先搜索

P372 krusakal算法实现最小生成树

*/

#include "StdAfx.h"

#include

#include

#include

using namespace std;

#define DefaultVertices 30

//图的基类,主要包含初始化,虚函数,方便以后拓展

template

class Graph{

public:

Graph(intsz=DefaultVertices){} //constructor

~Graph(){} // destructor

boolGraphEmpty(){ // isempty

if(numEdges==0)

return true;

else

return false;

}

boolGraphFull(){ //isfull

if(numVertices==maxVertices||numEdges==maxVertices*(Vertices-1)/2)

return true;

else

return false;

}

intNumberOfVertices() // return the number of current vertices

{

returnnumVertices;

}

intNumberOfEdges() //return the number of current edges {

returnnumEdges;

}

virtual T getValue(inti)=0;

virtual E getWeight(int v1,int v2)=0;

virtualintgetFirstNeighbor(int v)=0;

virtualintgetNextNeighbor(intv,int w)=0;

virtualboolinsertVertex(T& vertex)=0;

virtualboolinsertEdge(int v1,int v2,E cost)=0;

virtualboolremoveVertex(int v)=0;

virtualboolremoveEdge(int v1,int v2)=0;

intmaxVertices;

intnumEdges;

intnumVertices;

virtualintgetVertexPos(T vertex)=0;

};

//边的结构体

template

struct Edge{

intdest; //存放的是指向那个

E cost; //权值

Edge *link;

Edge(){} //构造函数

Edge(intnum,E weight):dest(num),cost(weight),link(NULL){}

bool operator !=(Edge& R){

return (dest!=R.dest)?true:false;

}

};

//顶点的结构体,包含数据,还有边

template

struct Vertex{

T data;

Edge *adj;

};

//用邻接矩阵表示的图的形式

template

classGraphlnk:public Graph{

friendistream& operator>>(istream&in,Graphlnk& G);

friendostream& operator<<(ostream&out,Graphlnk& G); public:

Graphlnk(intsz=DefaultVertices); //构造函数

~Graphlnk(); //析构函数

T getValue(inti) //获得处于i位置的值{

return (i>=0&&i

}

E getWeight(int v1,int v2); //获得权值

boolinsertVertex(T& vertex); //插入顶点

boolremoveVertex(int v); //移除顶点

boolinsertEdge(int v1,int v2,E cost); //插入边

boolremoveEdge(int v1,int v2); //移除边

intgetFirstNeighbor(int v);//获得第一个

intgetNextNeighbor(intv,int w);//获得相邻的

Vertex *NodeTable;

intgetVertexPos(T vertex)

{

for(inti=0;i

if(NodeTable[i].data==vertex)

returni;

return -1;

}

};

/**///建立空图

template

Graphlnk::Graphlnk(intsz)

{

//this

maxVertices=sz;

numVertices=0;

numEdges=0;

//创建顶点数组

NodeTable=new Vertex[maxVertices];

if(NodeTable==NULL)

cout<<"存储失败"<

for(inti=0;i

NodeTable[i].adj=NULL;

};

//destructor /

template

Graphlnk::~Graphlnk()

{

for(inti=0;i

{

Edge *p=NodeTable[i].adj;

while(p!=NULL)

{

NodeTable[i].adj=p->link;

delete p;

p=NodeTable[i].adj;

}

}

delete[] NodeTable;

}

//获取边的权值

template

E Graphlnk::getWeight(int v1,int v2) {

if(v1!=-1&&v2!=-1)

{

Edge *p=NodeTable[v1].adj;

while(p!=NULL&&p->dest!=v2){

p=p->link;

}

if(p!=NULL)

return p->cost;

}

return 0;

}

//插入顶点的函数实现

template

boolGraphlnk::insertVertex(T& vertex) {

if(numVertices==maxVertices)

return false;

NodeTable[numVertices].data=vertex;

numVertices++;

return true;

};

//删除顶点的实现

template

boolGraphlnk::removeVertex(int v)

{

if(numVertices==1||v<0||v>=numVertices)

return false;

Edge*p,*s,*t;

int k;

//删除第v个边链表的顶点

while(NodeTable[v].adj!=NULL)

{

cout<<"测试顶点的数值"<

//cout<<"test"<

p=NodeTable[v].adj;

cout<<"p的权值"<cost<

k=p->dest;

cout<<"k是邻接节点"<

//找对称存放的边结点

s=NodeTable[k].adj;

cout<<"s->cost 测试"<cost<

t=NULL;

while(s!=NULL&&s->dest!=v)

{

//cout<

t=s;

s=s->link;

cout<<"s->dest"<dest<

cout<link<<"能显示吗"<

cout<<"在while循环测"<cost<

}

//删除堆存放的边结点

cout<<"删除堆存放的边结点"<

if(s!=NULL)

{

if(t==NULL){

cout<<"s->link的权值"<link->cost<

NodeTable[k].adj=s->link;

cout<<"NodeTable[k].adjifceshi"<cost<

}

else{

cout<link->cost<<"之前"<

cout<link<

t->link=s->link;

//cout<link->cost<<"之后"<

}

delete s;

}

//清除顶点v的边链表结点

NodeTable[v].adj=p->link;

delete p;

numEdges--;

}

// cout<<"执行出来"<

numVertices--;

//填补

cout<<"NodeTable[v].data"<

NodeTable[v].data=NodeTable[numVertices].data;

p=NodeTable[v].adj=NodeTable[numVertices].adj;

cout<<"p=NodeTable[v].adj=NodeTable[numVertices].adj "<cost<

while(p!=NULL)

{

// cout<<"死循环??"<

// cout<dest].data<

s=NodeTable[p->dest].adj;

while(s!=NULL)

if(s->dest==numVertices)

{

s->dest=v;

break;

}

else

s=s->link;

p=p->link;

}

return true;

};

//移除边的函数的实现

template

boolGraphlnk::removeEdge(int v1,int v2)

{

if(v1!=-1&&v2!=-1)

{

Edge *p=NodeTable[v1].adj,*q=NULL,*s=p;

while(p!=NULL&&p->dest!=v2)

{

q=p;

p=p->link;

}

if(p!=NULL)

{

if(p==s)

NodeTable[v1].adj=p->link;

else

q->link=p->link;

delete p;

}

else

return false;

p=NodeTable[v2].adj;

q=NULL,s=p;

while(p->dest!=v1)

{

q=p;

p=p->link;

}

if(p==s)

NodeTable[v2].adj=p->link;

else

q->link=p->link;

delete p;

return true;

}

return false;

};

//插入边的函数实现

template

boolGraphlnk::insertEdge(int v1,int v2,E weight)

{

if(v1>=0&&v1=0&&v2

//v1对应边链表头指针

Edge *q,*p=NodeTable[v1].adj;

//寻找邻接顶点v2

while(p!=NULL&&p->dest!=v2)

p=p->link;

//找到此边不插入

if(p!=NULL)

return false;

// 否则,创建新结点

p=new Edge;

q=new Edge;

p->dest=v2;

p->cost=weight;

p->link=NodeTable[v1].adj;

//链入v1边链表

NodeTable[v1].adj=p;

q->dest=v1;

q->cost=weight;

q->link=NodeTable[v2].adj;

//链入v2边链表

NodeTable[v2].adj=q;

numEdges++;

return true;

}

return 0;

};

//获得第一个邻接定点的位置

template

intGraphlnk::getFirstNeighbor(int v)

{

//对应边链表第一个边节点

if(v!=-1)

{

//存在,返回第一个邻接顶点

Edge *p=NodeTable[v].adj;

if(p!=NULL)

//第一个邻接顶点不存在

return p->dest;

}

return -1;

};

//输出某邻接顶点w的下一邻接顶点,思路同上template

intGraphlnk::getNextNeighbor(intv,int w) {

if(v!=-1)

{

Edge *p=NodeTable[v].adj;

while(p!=NULL&&p->dest!=w)

p=p->link;

if(p!=NULL&&p->link!=NULL)

return p->link->dest;

}

return -1;

};

//重载运算符

template

istream& operator>>(istream&in,Graphlnk& G){ int choose;

cout<<"what do you want to do"<

in>>choose;

switch(choose)

{

case 0: break;

}

}

//重载运算

template

ostream& operator<<(ostream&out,Graphlnk& G) {

for(inti=0;i

out<

return out;

}

//深度优先搜索

template

void DFS(Graph& G,T& v)

{

inti,n=G.NumberOfVertices();

intloc;

bool *visited=new bool[n];

for(i=0;i

visited[i]=false;

loc=G.getVertexPos(v);

DFS(G,loc,visited);

delete[] visited;

}

//深度优先具体实现

template

void DFS(Graph&G,intv,bool visited[])

{

//深度优先,

cout<

visited[v]=true;

int w=G.getFirstNeighbor(v);

while(w!=-1)

{

if(visited[w]==false)

DFS(G,w,visited);

w=G.getNextNeighbor(v,w);

}

}

//广度优先=函数

template

void BFS(Graph& G,T& v)

{

inti,w,n=G.NumberOfVertices();

bool *visited=new bool[n];

for(i=0;i

visited[i]=false;

intloc=G.getVertexPos(v);

cout<

visited[loc]=true;

queue q;

q.push(loc);

while(!q.empty())

{

intloc=q.front();

q.pop();

w=G.getFirstNeighbor(loc);

while(w!=-1)

{

if(visited[w]==false)

{

cout<

visited[w]=true;

q.push(w);

}

w=G.getNextNeighbor(loc,w);

}

}

delete[] visited;

}

//并査集

intDefaultSize=10;

classUFSets{

public:

UFSets(intsz=DefaultSize);

~UFSets(){delete[] parent;}

UFSets& operator=(UFSets& R);

void Union(int Root1,int Root2);

int Find(int x);

voidWeightUnion(int Root1,int Root2);

int *parent;

int size;

};

//并査集构造函数

UFSets::UFSets(intsz)

{

size=sz;

parent=new int[size];

for(inti=0;i

parent[i]=-1;

}

//并査集查找

intUFSets::Find(int x)

{

while(parent[x]>=0)

x=parent[x];

return x;

}

//union简单,但是好容易出现退化树的情况

voidUFSets::Union(int Root1,int Root2)

{

parent[Root1]+=parent[Root2];

parent[Root2]=Root1;

}

//P265,为了避免出现退化的树,而用的算法,用加权的原则来改进union算法voidUFSets::WeightUnion(int Root1,int Root2)

{

int r1=Find(Root1),r2=Find(Root2),temp;

if(r1!=r2)

{

temp=parent[r1]+parent[r2];

if(parent[r1]>parent[r2])

{

parent[r1]=r2;

parent[r2]=temp;

}

else

{

parent[r2]=r1;

parent[r1]=temp;

}

}

else

Union(Root1,Root2);

}

//最小生成树边节点的类声明

template structMSTEdgeNode{

//顶点的位置以及权值

inttail,head;

E key;

//构造函数

MSTEdgeNode():tail(-1),head(-1),key(0){}

bool operator<=(MSTEdgeNode& R)

{

return key<=R.key;

}

bool operator>(MSTEdgeNode& R)

{

return key>R.key;

}

};

//最小生成树

template classMinSpanTree{

protected:

MSTEdgeNode *edgevalue;

intmaxSize,n;

public:

MinSpanTree(intsz=DefaultSize-1):maxSize(sz),n(0)

{

edgevalue=new MSTEdgeNode[sz];

}

int Insert(MSTEdgeNode& item);

};

//最小生成树的插入

template

intMinSpanTree::Insert(MSTEdgeNode& item)

{

cout<

return 0;

}

//P124~P125优先队列

constintDefaultPQSize=50;

template

classPQueue{

public:

PQueue(intsz=DefaultPQSize); //构造函数

~PQueue(){delete[] pqelements;} //析构函数

bool Insert(T& x); //插入函数

boolRemoveMin(T& x); //移除最小元素

boolgetFront(T& x); //取出最小元素

void makeEmpty(){count=0;} //制空队列

boolIsEmpty() //判断是队列否为空{return (count==0)?true:false;}

boolIsFull() //判断队列是否已满{return (count==maxSize)?true:false;}

intgetSize() //获得队列目前大小{return count;}

protected:

T *pqelements; //data

int count; //当前队列个数

intmaxSize; //队列最大值

void adjust(); //调整函数

};

//最小优先级最烈的构造函数P125

template

PQueue::PQueue(intsz):maxSize(sz),count(0)

{

pqelements=new T[maxSize];

assert(pqelements!=NULL);

}

//插入函数,插入到队尾P125

template

boolPQueue::Insert(T& x)

{

if(count==maxSize)

return false;

pqelements[count++]=x;

adjust();

return true;

}

//删除优先权值最小元素P126

template

boolPQueue::RemoveMin(T& x)

{

if(count==0)

return false;

x=pqelements[0];

for(inti=1;i

pqelements[i-1]=pqelements[i];

count--;

return true;

}

//取得最小优先权函数的值P126

template

boolPQueue::getFront(T& x)

{

if(count==0)

return false;

else

{

x=pqelements[0];

return true;

}

}

//P125~P126 将队尾元素按优先权调整到适当的位置,保持优先权不变template

voidPQueue::adjust()

{

T temp=pqelements[count-1];

int j;

for(j=count-2;j>=0;j--)

if(pqelements[j]<=temp)

break;

else

pqelements[j+1]=pqelements[j];

pqelements[j+1]=temp;

}

//P236 最小堆的类

template

classMinHeap:publicPQueue{

public:

MinHeap(intsz=DefaultSize); //构造函数

MinHeap(E arr[],int n); //重载构造函数

~MinHeap(){delete[] heap;} //析构函数

bool Insert(E& x); //插入函数

boolRemoveMin(E& x); //移除最小值函数

boolIsEmpty() //查看是否是空

{return (currentSize==0)?true:false;}

boolIsFull() //查看是否是满的

{return (currentSize==maxHeapSize)?true:false;}

void MakeEmpty() //将最小堆置成空

{currentSize=0;}

E getMin(); // 获取最小值

void output(); //输出最小堆的元素,进行验证private:

E* heap; //存放最小堆元素的数组

intcurrentSize; //最小堆当前元素的个数

intmaxHeapSize; //最小堆最多元素个数

void siftDown(intstart,int m); //下滑调整为最小堆

void siftUp(int start); //上滑调整为最小堆

};

//构造函数P237

template

MinHeap::MinHeap(intsz)

{

maxHeapSize=(DefaultSize

heap=new E[maxHeapSize];

if(heap==NULL)

{cerr<<"123"<

currentSize=0;

}

//最小堆的构造函数P237

template

MinHeap::MinHeap(E arr[],int n)

{

maxHeapSize=(DefaultSize

heap=new E[maxHeapSize];

if(heap==NULL)

{cerr<<"123"<

for(inti=0;i

heap[i]=arr[i];

currentSize=n;

intcurrentPos=(currentSize-2)/2;

while(currentPos>=0)

{

siftDown(currentPos,currentSize-1);

currentPos--;

}

}

//最小堆的下滑调整P238

template

voidMinHeap::siftDown(intstart,int m)

{

inti=start,j=2*i+1;

E temp=heap[i];

while(j<=m)

{

if(jheap[j+1])

j++;

if(temp<=heap[j])

break;

else

{

heap[i]=heap[j];

i=j;

j=2*j+1;

}

}

heap[i]=temp;

}

//最小堆的上滑调整P238~P239

template

voidMinHeap::siftUp(int start) {

int j=start,i=(j-1)/2;

E temp=heap[j];

while(j>0)

{

if(heap[i]<=temp)

break;

else

{

heap[j]=heap[i];

j=i;

i=(i-1)/2;

}

}

heap[j]=temp;

}

//最小堆移除最小值也就是根P239 template

boolMinHeap::RemoveMin(E& x) {

if(!currentSize)

{

cout<<"Heap Empty"<

return false;

}

x=heap[0];

heap[0]=heap[currentSize-1];

currentSize--;

siftDown(0,currentSize-1);

return true;

}

//最小堆的插入P239

template

boolMinHeap::Insert(E& x)

{

if(currentSize==maxHeapSize)

{

cerr<<"Heap Full"<

return false;

}

heap[currentSize]=x;

siftUp(currentSize);

currentSize++;

return true;

}

//获得最小堆的根

template

E MinHeap::getMin()

{

return heap[0];

}

//最小堆的输出

template

voidMinHeap::output()

{

for(inti=0;i

cout<

cout<

}

//krusal算法,逐步寻找最小权值的边,然后连接

template

voidKruskal(Graph&G,MinSpanTree& MST)

{

MSTEdgeNodeed;

intu,v,count;

//n是顶点的数目

int n=G.NumberOfVertices();

//m是边的数目

int m=G.NumberOfEdges();

MinHeap> H(m);

UFSets F(n);//并査集

for(u=0;u

for(v=u+1;v

if(G.getWeight(u,v)!=0)

{

// cout<<"u"<

// cout<

ed.tail=u;

ed.head=v;

ed.key=G.getWeight(u,v);

H.Insert(ed);

}

count=1;

//最小生成树加入边数计算

cout<<"这是分割线"<

while(count

{

//反复执行,取N-1条边

H.RemoveMin(ed);

//从最小对中退出具有最小值的边ed

u=F.Find(ed.tail);

v=F.Find(ed.head);

// cout<<"u"<

//取两定点所在党的根U,V

if(u!=v)

{

cout<<"u"<

//合并,联通他们

F.Union(u,v);

MST.Insert(ed);

count++;

}

}

}

//----------------------------------主函数----------------------

//大多数测试都在step6中完成的,这一步主要完成最小生成树int main()

{

MinSpanTreemst;

Graphlnk graph(7);

int a[7]={0,1,2,3,4,5,6};

for(inti=0;i<7;i++)

graph.insertVertex(a[i]);

//前面构建书上树已经成功,现在构建自己的树

graph.insertEdge(0,1,100);

graph.insertEdge(1,3,110);

graph.insertEdge(3,4,60);

graph.insertEdge(4,6,70);

graph.insertEdge(5,6,80);

graph.insertEdge(2,0,10);

graph.insertEdge(2,5,30);

graph.insertEdge(2,3,20);

graph.insertEdge(2,4,50);

graph.insertEdge(2,6,40);

graph.insertEdge(5,0,90);

//广度优先搜索

cout<<"这是广度优先"<

BFS(graph,a[0]);

cout<

//深度优先搜索,depth,是往下一直找

cout<<"这是深度优先"<

DFS(graph,a[0]);

cout<

//MSTEdgeNode

//根据书上的图所做的,kruskal算法

Kruskal(graph,mst);

cout<<"节点的数目"<

cout<<"边的数目"<

// if (graph.removeVertex(6))

// cout<<"删除成功"<

/* if (graph.removeVertex(3))

{

cout<<"删除成功"<

}

*/

if (graph.removeVertex(1))

cout<<"删除成功"<

cout<<"节点的数目"<

cout<<"边的数目"<

//cout<

return 0;

}

数据结构-第六章-图-练习题及答案详细解析(精华版)

图 1. 填空题 ⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵ 任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶ 图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度

⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk 【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。 2. 选择题 ⑴ 在一个无向图中,所有顶点的度数之和等于所有边数的()倍。 A 1/2 B 1 C 2 D 4 【解答】C 【分析】设无向图中含有n个顶点e条边,则。

数据结构树的有关算法

《数据结构》课程设计任务书 学期:11-12-2 班级:网络10 一、设计目的 《数据结构》是一门实践性较强的专业基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。 二、设计要求 1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 2、学生必须仔细研读《数据结构》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。 3、本次课程设计按照教学要求需要在一周半时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。 4、编程语言任选。 三、设计选题 题一:线索二叉树(**) 任务: 1.建立中序线索二叉树,并且中序遍历; 2.求中序线索二叉树上已知结点中序的前驱和后继; 需求分析和概要设计: 建立中序线索二叉树,并且中序遍历。首先就是要建立树,再将树中序线索化。求中序线索二叉树上已知结点中序的前驱和后继时,即是将树在遍历一遍。也可以在遍历的过程中,将树的结点放在数组中,当然必须讲述先遍历一遍,这是用空间来换时间。 详细设计: 树的结构体的声明: typedef char TElemtype; typedef enum PointerTag{Link,Thread}; //设置标志:Link为指针,Thread为线索typedef struct BiThrNode{ //树结点结构体 TElemtype data; struct BiThrNode *lchild,*rchild; PointerTag LTag,RTag; }BiThrNode,*BiThrTree; 相关函数的声明:

数据结构课程设计报告java最小生成树

上海电力学院 数据结构(JAVA)课程设计 题目:____最小生成树_______ 学生姓名:_****___________ 学号:_____*******_______ 院系:计算机科学与技术学院 专业年级: ______*****___级 20**年 *月**日

目录 1.设计题目 (1) 2.需求分析 (1) 1)运行环境 (1) 2)输入的形式和输入值的范围 (1) 3)输出的形式描述 (1) 4)功能描述 (1) 5)测试数据 (1) 3.概要设计 (1) 1)抽象数据类型定义描述 (1) .2)功能模块设计 (1) 3)模块层次调用关系图 (2) 4.详细设计。实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。 (2) 5.调试分析。包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。 (6) 6.用户使用说明。详细列出每一步的操作说明。 (7) 7. 测试结果 (7) 8.附录:程序设计源代码 (9)

一、设计题目 1).问题描述 若要在 n 个城市之间建设通信网络,只需要架设n-1 条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 2). 基本要求 以邻接多重表存储无向带权图,利用克鲁斯卡尔算法或普瑞姆算法求网的最小生成树。 二、需求分析 1)运行环境 软件在JDK运行,硬件支持windows系统 2)输入的形式和输入值的范围 自动生成顶点数据在10~20之间;各个顶点之间权值在25~50之间;通过程序改动亦可生成已知顶点权值之间的最小生成树,需将随机生成代码改为edge edge[]={new edge(0,1,16),new(0,2,18)......}; 将已知顶点、权值通过其函数输入再生成其所对应最小生成树。 3)输出的形式描述 输出随机生成顶点个数以及各个顶点之间权值;然后输出本次生成顶点之间构成的最小生成树。

数据结构二叉树习题含答案

2.1 创建一颗二叉树 创建一颗二叉树,可以创建先序二叉树,中序二叉树,后序二叉树。我们在创建的时候为了方便,不妨用‘#’表示空节点,这时如果先序序列是:6 4 2 3 # # # # 5 1 # # 7 # #,那么创建的二叉树如下: 下面是创建二叉树的完整代码:穿件一颗二叉树,返回二叉树的根 2.2 二叉树的遍历 二叉树的遍历分为:先序遍历,中序遍历和后序遍历,这三种遍历的写法是很相似的,利用递归程序完成也是灰常简单的: 2.3 层次遍历 层次遍历也是二叉树遍历的一种方式,二叉树的层次遍历更像是一种广度优先搜索(BFS)。因此二叉树的层次遍历利用队列来完成是最好不过啦,当然不是说利用别的数据结构不能完成。 2.4 求二叉树中叶子节点的个数 树中的叶子节点的个数= 左子树中叶子节点的个数+ 右子树中叶子节点的 个数。利用递归代码也是相当的简单, 2.5 求二叉树的高度 求二叉树的高度也是非常简单,不用多说:树的高度= max(左子树的高度,右子树的高度) + 1 2.6 交换二叉树的左右儿子 交换二叉树的左右儿子,可以先交换根节点的左右儿子节点,然后递归以左右儿子节点为根节点继续进行交换。树中的操作有先天的递归性。。 2.7 判断一个节点是否在一颗子树中 可以和当前根节点相等,也可以在左子树或者右子树中。 2.8 求两个节点的最近公共祖先 求两个节点的公共祖先可以用到上面的:判断一个节点是否在一颗子树中。(1)如果两个节点同时在根节点的右子树中,则最近公共祖先一定在根节点的右子树中。(2)如果两个节点同时在根节点的左子树中,则最近公共祖先一定在根节点的左子树中。(3)如果两个节点一个在根节点的右子树中,一个在根节点的

最小生成树数据结构课程设计报告

河北科技大学 课程设计报告 学生姓名:白云学号:Z110702301 专业班级:计算机113班 课程名称:数据结构课程设计 学年学期: 2 01 3—2 014学年第2学期指导教师:郑广 2014年6月

课程设计成绩评定表

目录 一、需求分析说明 (1) 1.1最小生成树总体功能要求 (1) 1.2基本功能 (1) 1.3 模块分析 (1) 二、概要设计说明 (1) 2.1设计思路 (1) 2.2模块调用图 (2) 2.3数据结构设计 (2) 2.3.1.抽象数据类型 (2) 2.3.2方法描述 (2) 三、详细设计说明 (3) 3.1主函数模块 (3) 3.2邻接表输出子模块 (3) 3.3邻接矩阵输出子模块 (3) 3.4创建邻接矩阵子模块 (3) 3.5创建邻接表子模块 (3) 3.6 Prim子模块 (3) 3.7 Kruscal子模块 (4) 四、调试分析 (4) 4.1实际完成情况说明 (4) 4.2 出现的问题及解决方案 (4) 4.3程序中可以改进的地方 (4) 六、课程设计总结 (7) 七、测试数据 (7) 八、参考书目 (7)

一、需求分析说明 1.1最小生成树总体功能要求 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 1.2基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 1.3 模块分析 主模块:用于生成界面和调用各个子模块。 Kruscal模块:以kruscal算法实现最小生成树。 Prim模块:以prim算法实现最小生成树。 邻接表模块:用邻接表方式存储图。 邻接表输出模块:输出邻接表。 邻接矩阵模块:用邻接矩阵方式存储图。 邻接矩阵模块:输出邻接矩阵。 二、概要设计说明 2.1设计思路 问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。 1) 普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。然后选择该顶点与V中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。 2) 克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树。

PDM的主要功能

PDM的主要功能 PDM是为企业提供了一种宏观管理和控制所有与产品相关信息以及与产品相关过程的机制和技术。PDM系统包含多项功能,从面向应用与系统支持的功能来看,一般包括电子仓库(又称电子数据存储、电子保险箱、电子资料室)、面向应用的使用功能(如文档控制、变更控制、配置管理、设计检索与零件库、项目管理等)、实用化支持功能(如通知与通信、数据传输与转换、图像服务与系统管理),其功能结构如图3所示。 图3.PDM系统的主要功能(面向应用与系统支持) 从软件功能模块的组成来看,一般包括电子数据存储和文档管理、工作流程管理、产品结构及配置管理、分类与检索管理、项目管理、集成接口、用户化工具等,其功能结构如图4所示。

图4.PDM系统的功能(面向软件功能模块的组成) 2.2.1项目管理功能 项目管理的定义:为了在确定的时间内完成既定的项目,通过一定的方式合理地组织有关人员,并有效地管理项目中所有资源(人员、设备等)与数据,控制项目进度的系统管理方法,项目管理所涉及的信息最多,范围最广,实现起来也最复杂。 项目管理是面向过程的一种管理模式,它强调对项目的全过程(包括立项、计划、执行、控制和收尾等)进行全方位管理,其静态领域涉及范围管理、时间管理、成本管理、质量管理、人力资源管理、沟通管理、采购管理、风险管理和综合管理九个知识体系。 与目标管理不同,项目本身具有不可重复性并包含许多不确定因索,这就使得管理者和任务承担者很难就项目达成双方一致的目标。由于项目管理贯穿于项目的整个生命周期,而且围绕项目将企业不同职能部门的成员组成一个有机的整体,项目管理者既是这个团队的领导者,又是项目的执行者,对整个项目及其过程负责,准时、优质地完成全部工作,实现项目的目标。因此,项目管理可以避免目标管理特别是以人工为主的管理模式的弊端,有助于企业处理项目实施过程中需要跨领域解决的复杂问题,能有效地提升企业的运营效率。 PDM系统的项目管理功能是为完成对项目进行管理的任务而设蜀的,进行项目管理,需要定制项目模型,在项目模型中对项目的任务、人员和时间安排进行描述。利用文档管理功能对项目的所有文档和数据进行管理;利用用户管理功能组织项目组,安排项目组成员在

数据结构树的实现实验报告

数据结构设计性实验报告 课程名称_____ ____ 题目名称 学生学院 专业班级 学号 学生姓名 指导教师 2010 年 7 月 6 日

抽象数据类型:树的实现 一.需求分析 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的内部结构。树的结构在客观世界广泛存在,如人类社会的族谱和各种社会组织机构都可以用树来形象表示。树在计算机领域中也得广泛应用,如在编译程序中,可用树来表示源程序的语法结构,又如在数据库系统中,树形结构也是信息的重要组织形式之一。 二.实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。 三.实验环境 1、硬件:PC机 2、软件:Microsoft Visual C++ 6.0 四.设计说明 本程序采用树的二叉链表(孩子指针-兄弟指针-双亲指针)存储表示,以下是树的结构定义和基本操作: ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3, …,Dm(m>0),对于任意j ≠k(1≤j,k≤m)有Dj∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在数据元素xi∈Di有∈H; (3) 对应于D-{root}的划分,H-{,…,}有唯一的一个划分H1,H2,…,Hm(m>0),对任意j≠k(1≤j,k≤m)有Hj∩Hk=NULL,且对任意i(1≤i≤m),Hi是Di 上的二元关系,(Di,{Hi})是一棵符合本定义的树,称为根root的子树。 基本操作P: InitTree(&T); 操作结果:构造空树T。 DestroyTree(&T); 初始条件:树T存在。 操作结果:销毁树T。 CreateTree(&T,definition); 初始条件:definition给出树T的定义。 操作结果:按definition构造树T。 ClearTree(&T);

计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编6

计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编 6 (总分:88.00,做题时间:90分钟) 一、单项选择题(总题数:33,分数:66.00) 1.一棵完全二叉树又是一棵( )。【华中科技大学2006一、7(2分)】 A.平衡二叉树 B.堆√ C.二叉排序树 D.哈夫曼(Huffman)树 完全二叉树的叶子至多在下面两层上,且一个结点若无左子树,绝不能有右子树。平衡二叉树任何结点的左右子树的高度差的绝对值不超过1,但其结点的值符合二叉排序树的定义。平衡二叉树(包括二叉排序树)的树形不一定是完全二叉树。堆是一个序列,有大堆和小堆,编号为i的结点,其父结点、左右子女结点之间位置的关系,符合完全二叉树父结点、左右子女结点之间的关系,从这点上说,可以把堆看成完全二叉树。哈夫曼树是二叉树,但树形不一定满足完全二叉树的定义。 2.一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是( )。【合肥工业大学1999一、5(2分)】 A.不确定 B.0 C.1 D.2 √ 左子树为空的二叉树的根结点的左线索为空(无前驱),先序序列的最后结点的右线索为空(无后继),共2个空链域。 3.一棵左右子树均不空的二叉树在先序线索化后,其中空的链域的个数是( )。【合肥工业大学2000一、5(2分)】 A.0 B.1 √ C.2 D.不确定 4.若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为( )。【南京理工大学1996 一、6(2分)】 A.X的双亲 B.X的右子树中最左的结点 C.X的左子树中最右结点√ D.X的左子树中最右叶结点 5.引入二叉线索树的目的是( )。【南京理工大学1998一、5(2分)】 A.加快查找结点的前驱或后继的速度√ B.为了能在二叉树中方便地进行插入与删除 C.为了能方便地找到双亲 D.使二叉树的遍历结果唯一 6.线素二叉树是一种( )结构。【西安电子科技大学1996一、9(2分)】 A.逻辑 B.逻辑和存储 C.物理√ D.线性 7.甩个结点的线索二叉树上含有的线索数为( )。【中山大学1998二、8(2分)】

最小生成树实验报告

数据结构课程设计报告题目:最小生成树问题 院(系):计算机工程学院 学生姓名: 班级:学号: 起迄日期: 指导教师: 2011—2012年度第 2 学期 一、需求分析 1.问题描述:

在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 2.基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 3.输入输出 以文本形式输出最小生成树,同时输出它们的权值。通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。 二、概要设计 1.设计思路: 因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。 2.数据结构设计: 图状结构: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R={VR} VR={|v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息} 基本操作: CreateGraph( &G, V, VR ) 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。 DestroyGraph( &G )

初始条件:图G存在。 操作结果:销毁图G。 LocateVex( G, u ) 初始条件:图G存在,u和G中顶点有相同特征。 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返 回其它信息。 GetVex( G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的值。 PutVex( &G, v, value ) 初始条件:图G存在,v是G中某个顶点。 操作结果:对v赋值value。 FirstAdjVex( G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点, 则返回“空”。 NextAdjVex( G, v, w ) 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。 操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的 最后一个邻接点,则返回“空”。 InsertVex( &G, v ) 初始条件:图G存在,v和图中顶点有相同特征。 操作结果:在图G中增添新顶点v。 DeleteVex( &G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:删除G中顶点v及其相关的弧。 InsertArc( &G, v, w )

Excel模版创建pdm

Excel模版创建pdm 一、将数据字典中的数据表结构粘贴到Excel文件中,整理成如下图所示格式 二、在powerdesigner中创建PDM工程,选中该工程,然后打开脚本代码窗口:Tools -Execute Commands -Edit\Run Script ,编写代码脚本。 三、脚本代码

Dim mdl ' the current model Set mdl = ActiveModel If (mdl Is Nothing) Then MsgBox "没有活动的模版" End If Dim HaveExcel Dim RQ RQ = vbYes 'MsgBox("Is Excel Installed on your machine ?", vbYesNo + vbInformation, "Confirmation") If RQ = vbYes Then HaveExcel = True ' Open & Create Excel Document Dim x1 ' Set x1 = CreateObject("Excel.Application") x1.Workbooks.Open "C:\Users\Administrator\Desktop\Book1.xls" '指定excel文档路径 Else HaveExcel = False End If a x1, mdl sub a(x1, mdl) dim rwIndex dim tableName dim colname dim table dim col dim count on error Resume Next set table = mdl.Tables.CreateNew '创建一个表实体 https://www.360docs.net/doc/794492296.html, = "国家信息表" '指定表名,如果在Excel文档里有,也可以.Cells(rwIndex, 3).Value 这样指定 table.Code = "LU_STATUS" '指定表名编码 count = count + 1 For rwIndex = 2 To 1000 '指定要遍历的Excel行标,此处第一列为列名,古从第二行开始循环 With x1.Workbooks(1).Worksheets("sheet1")'需要循环的sheet名称 If .Cells(rwIndex, 1).Value = "" Then Exit For End If

数据结构-树练习题

数据结构-树练习题 一、选择题 1、二叉树的深度为k,则二叉树最多有( C )个结点。 A. 2k B. 2k-1 C. 2k-1 D. 2k-1 2、用顺序存储的方法,将完全二叉树中所有结点按层逐个从左到右的顺序存放在一维数组R[1..N]中,若结点R[i]有右孩子,则其右孩子是( B )。 A. R[2i-1] B. R[2i+1] C. R[2i] D. R[2/i] 3、设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前面的条件是( B )。 A. a在b的右方 B. a在b的左方 C. a是b的祖先 D. a是b的子孙 4、设一棵二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树先序遍历序列为()。 A. adbce B. decab C. debac D. abcde 5、在一棵具有5层的满二叉树中结点总数为( A )。 A. 31 B. 32 C. 33 D. 16 6、由二叉树的前序和后序遍历序列( B )惟一确定这棵二叉树。 A. 能 B. 不能 7、某二叉树的中序序列为ABCDEFG,后序序列为BDCAFGE,则其左子树中结点数目为( C )。 A. 3 B. 2 C. 4 D. 5 8、若以{4,5,6,7,8}作为权值构造哈夫曼树,则该树的带权路径长度为( C )。 A. 67 B. 68 C. 69 D. 70 9、将一棵有100个结点的完全二叉树从根这一层开始,每一层上从左到右依次对结点进行编号,根结点的编号为1,则编号为49的结点的左孩子编号为(A )。 A. 98 B. 99 C. 50 D. 48 10、表达式a*(b+c)-d的后缀表达式是( B )。 A. abcd+- B. abc+*d- C. abc*+d- D. -+*abcd 11、对某二叉树进行先序遍历的结果为ABDEFC,中序遍历的结果为DBFEAC,则后序遍历的结果是( B )。 A. DBFEAC B. DFEBCA C. BDFECA D. BDEFAC 12、树最适合用来表示( C )。 A. 有序数据元素 B. 无序数据元素 C. 元素之间具有分支层次关系的数据 D. 元素之间无联系的数据 13、表达式A*(B+C)/(D-E+F)的后缀表达式是( C ) A. A*B+C/D-E+F B. AB*C+D/E-F+ C. ABC+*DE-F+/ D. ABCDED*+/-+ 14、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()。 A. 不发生改变 B. 发生改变 C. 不能确定 D. 以上都不对 15、假定在一棵二叉树中,度为2的结点数为15,度为1的结点数为30,则叶子结点数为()个。 A. 15 B. 16 C. 17 D. 47 16、由权值为3,6,7,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为()。 A. 51 B. 23 C. 53 D. 74

基于matlab构造最优二叉树

摘要 Matlab是一种用于算法开发,数据可视化,数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB是当今最优秀的科技应用软件之一,利用MATLAB 对层次分析法的判断、分析和计算过程进行处理后,为决策者提供方便友好的对话界面。只要决策者在MATLAB软件中输入自己的层次结构方案和两两对比的判断矩阵后能迅速得出相应的结果,为解决实际问题提供一个快捷的方法。从而提高人们的决策效率,同时也为科技工作者使用层次分析法提供一种新思路。本文是利用matlab的强大功能来构造最优二叉树。二叉树是一种非常重要以及常见的数据结构,不仅在计算机系统中运用广泛,而且在日常生活中也有一定的应用。本文概述了二叉树的数据结构以及使用matlab来模拟出二叉树的数据结构,从而来实现二叉树的插入,删除,查询等常用功能。 关键词:Matlab;二叉树;数据结构;

ABSTRACT Matlab is used for algorithm development, data visualization, data analysis and numerical calculation of the senior technical computing language and interactive environment. Matlab is the most outstanding application of science and technology, using MATLAB to determine the right level of analysis, analysis and computation processing, in order to provide decision makers with convenient user-friendly dialog interface. When the decision-makers in MATLAB software, enter their own hierarchy of the program and judgment matrix to determine quickly after the corresponding results obtained, in order to solve practical problems to provide a quick method. Thereby enhancing the efficiency of people's decision-making, but also for the scientific and technological workers to use AHP to provide a new idea.This article is using matlab to construct optimal binary tree. Binary Tree is a very important and common data structures, it is widely used in the computer system. This article outlines the binary tree data structure and the use of matlab to simulate a binary tree data structure, in order to achieve the binary tree insertion, deletion, query and other commonly used functions. Key words:Matlab;binary tree;data struction;

树在数据结构中的简单应用

题目:树在数据结构中的简单应用树在数据结构中的简单应用

Simple Application of Tree In Data-structure 摘要 树形结构是一类重要的非线性结构.本文研究了树形数据结构的基础知识,包括相关定义、操作以及树在数据结构中的简单应用问题.主要运用图示以及相关的算法来研究树以及树在数据结构中的若干应用问题,如在编码问题中的应用、在查找算法中的应用等. 关键词:树;二叉树;数据结构;树的应用

ABSTRACT The construction of tree form is an important construction of not line. In this paper, we research the base knowledge of tree including some correlation definition, operation and the simple application of tree in data structure. We research tree and some application of tree in data structure by diagram and some correlative arithmetic, for example, in coding, in arithmetic and so on. Key words : Tree, Tree of two fork; Data construction; The tree's application 目录

最小生成树问题中北大学数据结构课程设计资料

中北大学 数据结构与算法课程设计 说明书 学院、系:软件学院 专业:软件工程 班级: 学生姓名:学号: 设计题目:最小生成树问题 起迄日期: 2015年1月12日- 2015年1月29日指导教师:王秀娟 2015 年1月 29 日

1需求分析 1.1已知一个无向连通网表示n个城市以及城市间可能设置的通信网络线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。我们要选择一棵生成树,使总的耗费最小。 1.2该无向连通图的建立需要使用两种存储结构,即邻接表和邻接矩阵。 1.3实现最小生成树需要使用两种算法。即普里姆算法和克鲁斯卡尔。 1.4程序通过人机交互实现数据的输入和输出。 2选题要求 设计内容: 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用(邻接表和邻接矩阵)两种,采用课本上的两种求解算法。 设计要求: (1) 符合课题要求,实现相应功能; (2) 要求界面友好美观,操作方便易行; (3) 注意程序的实用性、安全性。 3程序设计方法及主要函数介绍 ADT Graph{ 数据对象V;V是具有相同特性的数据元素的集合,成为顶点集。 数据关系R: R = {VR} VR = {(v,w)|v,w为V集合中的元素,(v,w)表示v和w之间存在的路径} 基本操作P; CreateMGraph(MGraph *G) 初始条件:V是图的顶点集,VR是图的边的集合。 操作结果:按V和VR的定义构造图G,用邻接矩阵存储。 CreateALGraph(ALGraph *G)

数据结构 二叉树练习题答案

数据结构第6章树和二叉树 一、下面是有关二叉树的叙述,请判断正误 (√)1.若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n-1个非空指针域。 n个结点的二叉树有n-1条分支 (×)2.二叉树中每个结点的两棵子树的高度差等于1。 (√)3.二叉树中每个结点的两棵子树是有序的。 (×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。 (×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树 (若存在的话)所有结点的关键字值。 (应当是二叉排序树的特点) (×)6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。(应2k-1) (×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 (×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i -1个结点。

(应2i-1) (√)9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。(用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,即有后继链接的指针仅n-1个,还有n+1个空指针。)采用二叉链表存储有2n个链域,空链域为:2n-(n-1)=n+1 (√)10.具有12个结点的完全二叉树有5个度为2的结点。 最快方法:用叶子数=[ n/2] =6,再求n2=n0-1=5 [n/2] 除的结果四舍五入 二、填空 1.由3个结点所构成的二叉树有5种形态。 2. 一棵深度为6的满二叉树有n1+n2=0+ n2= n0-1=31 个分支结点和26-1 =32个叶子。 注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。 (或:总结点数为n=2k-1=26-1=63,叶子数为n0= [ n/2] =32,满二叉数没有度为1的结点,由n0=n2+1得n2=n0-1=32-1=31)

PDM系统功能介绍

1 PDM的常见功能介绍 到目前为止,还没有一个商用PDM软件拥有全部可罗列的PDM功能,其中有的功能构件还有待于进一步发展和完善。 但是,一般PDM系统都包括文档管理、产品配置管理及工作流程管理等最基本的功能,能对产品的整个生命周期进行完整的描述和控制,因此,PDM在企业中的作用已经普遍为大家所认同。 1.1 电子仓库 1.1.1 电子仓库介绍 在企业中,大量与产品相关的数据往往分布在多部门,甚至是多区域中,而且这些数据的格式也是多样的,如文本文件、数据库、图纸文件等,对这些数据的查询、浏览、共享,以及结合工作流程来管理这些数据等,都是企业在进行信息集成时经常遇到的问题。 PDM管理的主要对象是产品的“元数据”,即有关产品信息的信息,其实现基础是电子仓库(Electronic Data Vault)。实施并行工程所需要的“在正确的时间、把正确的数据、按正确的方式、传递给正确的人”对PDM数据管理提出了更高的要求。 电子仓库(Data Vault)是PDM最基本的功能,也是PDM的核心,通常是建立在通用的关系数据库基础上,主要保证数据的安全性和完整性,并支持各种查询和检索功能。 PDM系统中的电子仓库用以取代人工方式的纸质档案管理,使用户方便、快捷、安全地存取、维护及处理各种有关产品的文档,如从设计阶段产生的AutoCAD图纸的数据文件、3D实体造型的数据文件、CAE的分析报告,到制造阶段可能产生的变更单等,都是电子仓库管理的对象。 电子仓库为用户和应用之间的数据传递提供一种安全的手段,其透明性可使用户无需考虑分布式环境下各种数据的实际物理存放位置,允许用户迅速地、集中地处理访问全企业的产品信息,并且使整个企业的各部门共享产品数据。 PDM的电子仓库和文档管理提供了对分布式异构数据生成,存储,查询,控制存取,恢复,编辑,电子检查和记录,电子对象的历史及通用文件管理等能力。 在PDM中,数据的访问对用户来说是完全透明的,用户无需了解应用软件的运行路径、安装版本以及文档的物理位置,以及自己得到的是否是最新版本等信息,所有描述产品、部件或零件的数据都由PDM统一管理,自动集中修改。 PDM系统通过建立在数据库之上的相关联指针,建立不同类型的或异构的产品数据之

树在数据结构中的简单应用

题目:树在数据结构中的简单应用

树在数据结构中的简单应用 Simple Application of Tree In Data-structure 摘要 树形结构是一类重要的非线性结构.本文研究了树形数据结构的基础知识,包括相关定义、操作以及树在数据结构中的简单应用问题.主要运用图示以及相关的算法来研究树以及树在数据结构中的若干应用问题,如在编码问题中的应用、在查找算法中的应用等.

关键词:树;二叉树;数据结构;树的应用 ABSTRACT The construction of tree form is an important construction of not line. In this paper, we research the base knowledge of tree including some correlation definition, operation and the simple application of tree in data structure. We research tree and some application of

tree in data structure by diagram and some correlative arithmetic, for example, in coding, in arithmetic and so on. Key words : Tree, Tree of two fork; Data construction; The tree's application 目录 摘要 (Ⅰ)

徐州工程学院数据结构最小生成树实验文档

实验九图的最小生成树算法的实现 实验预备知识: 1.理解图最小生成树的意义和相应算法。 2.掌握带权图的存储结构。 一、实验目的 1.使学生熟悉最小生成树的算法实现。 2.掌握带权图的存储结构和处理方法。 二、实验环境 ⒈硬件:每个学生需配备计算机一台。操作系统:DOS或Windows; ⒉软件:DOS或Windows操作系统+Turbo C; 三、实验要求 1.能够独立完成带权图的存储和最小生成树的生成 四、实验内容 1.在自己的U盘的“姓名+学号”文件夹中创建“实验9”文件夹,本次实验的所有程序和数据都要求存储到本文件夹中。 2.现在某电信公司要对如下图的几个城市之间进行光纤连接布线,请用合适的存储结构将下图存储到计算机中方便进行处理。 3.现在公司想以最小的代价将所有城市连通,方便所有城市间通信,请用普里姆算法和克鲁斯卡尔算法实现本图的最小生成树

#include #include #define INF 50 typedef struct ArcNode{ int adjvex; //该弧所指向的顶点位置struct ArcNode *nextarc; //下一个临接点 int weight; //弧的权重 }ArcNode; //表结点 typedef struct VNode{ char data; //顶点信息 ArcNode *firstarc; //指向下一个结点 }VNode,AdjList[6]; typedef struct{ AdjList LH; //创建头结点数组 int vexnum; //图的点的个数 int arcnum; //图的边的个数 }Graph; typedef struct{ char nextvex; int lowcost; int know; }Auxiliary_array; //辅助数组结构体 void main (void){ void buildtu (Graph*); void printgraph(Graph*); void prim( Graph *G, char u); char u; Graph UDG; Graph *G = &UDG; buildtu(G); printgraph(G); //打印图 printf("请输入起始顶点:\n"); while(getchar()!='\n'); u = getchar();

树和二叉树习题数据结构

习题六树和二叉树一、单项选择题 1.以下说法错误的是 ( ) A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继 C.树形结构可以表达(组织)更复杂的数据 D.树(及一切树形结构)是一种"分支层次"结构 E.任何只含一个结点的集合是一棵树 2.下列说法中正确的是 ( ) A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的度肯定等于2 D.任何一棵二叉树中的度可以小于2 3.讨论树、森林和二叉树的关系,目的是为了()A.借助二叉树上的运算方法去实现对树的一些运算B.将树、森林按二叉树的存储方式进行存储

C.将树、森林转换成二叉树 D.体现一种技巧,没有什么实际意义 4.树最适合用来表示 ( ) A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定 6.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B.M1+M2 C.M3 D.M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A. 250 B. 500 C.254 D.505 E.以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( ) A.不确定 B.2n C.2n+1 D.2n-1 9.二叉树的第I层上最多含有结点数为() A.2I B. 2I-1-1 C. 2I-1 D.2I -1

相关文档
最新文档