3 事故二叉树绘图
下面所示的3个函数分别为求结点的垂直坐标、水平坐标、孩子个数的函数。这对计算机辅助事故树绘图很有意义。
/*求事故树的结点的垂直坐标。*/
void level(struct node *gen, int lev)
{
if(gen){ gen->vert=lev;
level(gen->fch,lev+1);
level(gen->nsib,lev);
};
}
/* 求事故树的结点的水平坐标,其中ho为全局double变量。*/
void horizon(struct node *root)
{if(root){if(!root->fch){root->hori=ho;
ho=ho+1;
if(root->pare)root->pare->hori=root->pare->hori+root->
hori/(double)(root->pare->chinum);
horizon(root->nsib);
}
else {horizon(root->fch);
if(root->pare)root->pare->hori=root->pare->hori+root->
hori/(double)(root->pare->chinum);
horizon(root->nsib);
};
};
}
/*求每个结点的孩子数目的程序*/
void childnum(struct node *root)
{
struct node *p;
int i;
图3
事故树举例
if(root){ p=root->fch; i=0;
while(p) { p=p->nsib;
i++;
};
root->chinum=i;
childnum(root->fch);
childnum(root->nsib);
};
}
4 事故二叉树结点分裂法
最小割集的求法很多[2],如行列法、结构法、布尔代数化简法、质数代入法、矩阵法。这些方法,要么是难以用计算机语言实现,要么是受数组定义的限制,影响动态扩充存储空间。下面介绍一种二叉树结点分裂法:
图4
图3所示事故树的存储结构
假设有一棵事故树,它的逻辑结构如图3。
则它的二叉树存储结构如图4。
另外,再定义一棵二叉树,其结点的存储结构的c语言定义如下:
struct jiedian{
图5
二叉树初始化
struct jiedian *zongxiang;
char *info;
struct jiedian *hengxiang;
………(可以继续扩充)
};
图6
二叉树遍历与分裂的过程
一开始,得到如图5所示的一棵二叉树。然后对这棵二叉树进行遍历,当遍历所遇到的结点的信息代表的是或门时,对该结点进行横向分裂;当遍历所遇到的结点的信息代表的是与门时,对该结点进行纵向分裂。一次二叉树遍历完后,紧接着进行下一次遍历,直到遍历所遇到的所有的结点的信息都代表着叶子结点的信息为止。遍历与分裂过程如图6。
可以把这个结果看成是以zongxiang指针连接起来的一个链表,此链表便是图3所示的事故树的割集。然后对此链表各元素进行比较,把应该删除的元素进行删除,最后就可以得到图3所示的事故树
上一页 [1] [2] [3] 下一页