如图1的这棵树http://blog.csdn.net/andy8205/archive/2007/08/03/1724625.aspx
怎样定义一个存放按层次遍历得到的故障树各节点的CList链表:CList<FtNode, FtNode&> FtList,可以实现如图2所示的存储形式?
哪位大侠可以给出CList<FtNode, FtNode&> FtList中的代码呀,有急用,谢谢啦,立即给分!
怎样定义一个存放按层次遍历得到的故障树各节点的CList链表:CList<FtNode, FtNode&> FtList,可以实现如图2所示的存储形式?
哪位大侠可以给出CList<FtNode, FtNode&> FtList中的代码呀,有急用,谢谢啦,立即给分!
==>
CList <CNodeData,CNodeData&>
首先,得告诉你:图2是图1的树在计算机中的一种存存储结构,因为计算机中存储的数据都是二维的。看起来图1应该是一个二叉树的结构,那就以二叉树来大概说明一下吧。如果与实际有出入,那你得先给出,图1树的在存储结构呀。因为具体的遍历是根据存储结构来确定的呀。
设节点中的数据已经定义为:FtNode类型。
typedef struct tree //定义二叉树节点的结构
{
FtNode Data;
tree * LeftChild;
tree * RightChild;
}TREE;
//遍历二叉树CList <FtNode, FtNode&> FtList;
void GoW(TREE* t)
{
CList Temp = new(CList);
Temp = t->Data;
FtList.AddTail(Temp);
if(t->LeftChild != NULL)Gow(t->LeftChild);
if(t->RightChild!= NULL)Gow(t->RightChild);
}
CList <FtNode, FtNode&> FtList;
void GoW(TREE* t)
{
FtList.AddTail(t->Data);
if(t->LeftChild != NULL)Gow(t->LeftChild);
if(t->RightChild!= NULL)Gow(t->RightChild);
}
typedef struct tree //定义二叉树节点的结构
{
FtNode Data; //
tree * LeftChild; //
tree * RightChild; //
}TREE;
CList <FtNode, FtNode&> FtList; ////广度优先遍历二叉树
void BFS(TREE* t)
{
if(t==NULL)return; //若是棵空树,则退出
TREE Temp; //定义一个临时变量
FtList.AddTail(*t); //将树根添加到FtList的表头
POSITION pos = FtList.GetHeadPosition(); //获取表头
for (int i = 0; i < FtList.GetCount(); i++)
{
Temp =(TREE)FtList.GetNext(pos)); //从表中取出pos指向的节点
if(Temp.LeftChild != NULL) //若该节点的左孩子不空
FtList.AddTail(*(Temp.LeftChild )); //则将左孩子添加到FtList表尾
if(Temp.RightChild!= NULL) //若该节点的右孩子不空
FtList.AddTail(*(Temp.RightChild)); //则将右孩子添加到FtList表尾
} //遍历结束的同时,FtList表也建成了。
)
其实你只要用GOOGLE搜一下“广度优先遍历二叉树”或者是“按层次遍历二叉树”就可以找到一大堆的呀。呵呵。
唉!那就你不会分开找呀?先找到CLIST,知道怎么用CLIST后,再找按层次遍历二叉树的例子,学会算法,然后就可以自己改,将两个结合在一起就行了呀。要知道所谓的“编程”就是将许多现有的东西按自己的需要结合在一起呀。呵呵。
PS:有时候搜索的时候,应该注意不同的称呼。比如“按层次遍历二叉树”与“广度优先遍历二叉树”本来就是同一回事,有时候你按前面的名称搜不到话,不防换成后面的名称再搜搜,也许就能找到你想要的。呵呵。