广度优先搜索树中遇到的实际问题,急切等待答案!!!

YUTIANMAJI 2007-05-29 05:46:04
//下面是对树的节点定义
#define MAX_TREE_SIZE 100
struct PTNode
{TElemType data;
int parent;//双亲位置域
};
struct PTree
{
PTNode nodes[MAX_TREE_SIZE];
int n;//节点数
};
//构造空树
Status IniTree(PTree &T)
{T.n=0;//构造空树
return OK;
}
typedef struct
{
int num;
TElemType name;
}QElemType;//定义队列元素类型
//构造树(

Status CreateTree(PTree &T)
{
LinkQueue q;
QElemType p,qq;
int i=1,j,l;
char c[MAX_TREE_SIZE];//临时存放孩子结点数组
InitQueue(q);//初始化队列
printf("请输入根结点(字符型,空格为空): ");
scanf("%c%*c",&T.nodes[0].data);//根结点序号为0,%*c吃掉回车符
if(T.nodes[0].data!=Nil)//非空树
{T.nodes[0].paraent=-1//根结点无双亲
qq.name=T.nodes[0].data;
qq.num=0;
EnQueue(q,qq);//入队此节点
while(i<MAX_TREE_SIZE&&!=QueueEmpty(q))//数组队列不为空
{
DeQueue(q,qq);//出队一个结点
printf("请按长幼顺序输入结点%c的所有孩子: ",qq.name);
gets(c);
l=strlen(c);
for(j=0;<1;++)
{
T.nodes[i].data=c[j];
T.nodes[i].parent=qq.num;
p.name=c[j];
p.num=i;
EnQueue(q,p);//入队此节点
i++;
}
}
if(i>MAX_TREE_SIZE)
{printf"结点数超过数组容量\n")
exit(OVERFLOW);
}
T.n=i;
}
else
T.n=0;
return OK;
}
下面需要用广度优先方法遍历树,得到记录每层节点个数的一维数组G[level],和记录包含每一层具体节点的二维数组CJ[M,M],我就不会了,望高手给点建议
int level;
int G[N];
int GJ[M,M];
...全文
481 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
linzhanghui 2007-06-07
  • 打赏
  • 举报
回复
up 帮你顶一下
dmt9697 2007-06-02
  • 打赏
  • 举报
回复
楼主结点定义错了,你要想得到某一层所有结点,应该用孩子兄弟定义法,或者干脆
class TNode{
TElemType * data;
int NodeNo;
TNode * DadNode;
TNode * SonNode;
TNode * NextNode;
}
遍历这样存储(第n层的结点肯定是n-1层的结点的所有孩子)
不知道为什么要用二维的,一维数组就可以实现了
int N=0;M=0//N当前结点属于第几层,M控制是否深度N加1 ,M>=G[i]则深度加1
void cunchu(int * 二维行数N,int * M,TElemType * node){
if(node!=NULL){
G[N]=G[N]++;
cunchu(二维行数N,node->NextNode);
cunchu(二维行数N,node->SonNode);
M++;
if(M>=G[N]){//也有可能(M>=G[N]-1)看你怎么初始化了,我不想多考虑了
(*N)++;
(*M)=0;
}
}
dai_weitao 2007-05-30
  • 打赏
  • 举报
回复
广度优先就是前序遍历搜索时,记录上一层结点指针,然后从左到右。
spofmy 2007-05-29
  • 打赏
  • 举报
回复
学习了
YUTIANMAJI 2007-05-29
  • 打赏
  • 举报
回复
我到想结,可是我还没得到我要的答案阿,大哥们在仔细看一下我的问题,指教一下
ReverseEngineering 2007-05-29
  • 打赏
  • 举报
回复
记得揭贴哟
YUTIANMAJI 2007-05-29
  • 打赏
  • 举报
回复
是一种层序遍历,可需要得到记录每层节点个数的一维数组G[level],和记录包含每一层具体节点的二维数组CJ[M,M],我就不会了,望高手给点建议
FingerStyle 2007-05-29
  • 打赏
  • 举报
回复
树的广度优先 ?? 不就是层序遍历吗 ???
jixingzhong 2007-05-29
  • 打赏
  • 举报
回复
[转] 遍历概念

 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。
 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

遍历方案

1.遍历方案
 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
 (1)访问结点本身(N),
 (2)遍历该结点的左子树(L),
 (3)遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
 NLR、LNR、LRN、NRL、RNL、RLN。
注意:
 前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

2.三种遍历的命名
 根据访问结点操作发生位置命名:
  ① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问结点的操作发生在遍历其左右子树之前。
  ② LNR:中序遍历(InorderTraversal)
——访问结点的操作发生在遍历其左右子树之中(间)。
  ③ LRN:后序遍历(PostorderTraversal)
——访问结点的操作发生在遍历其左右子树之后。
注意:
 由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

遍历算法

1.中序遍历的递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)访问根结点;
(3)遍历右子树。

2.先序遍历的递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 遍历左子树;
(3) 遍历右子树。

3.后序遍历得递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)遍历右子树;
(3)访问根结点。

4.中序遍历的算法实现
 用二叉链表做为存储结构,中序遍历算法可描述为:
void InOrder(BinTree T)
{ //算法里①~⑥是为了说明执行过程加入的标号
① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf("%c",T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder

参考代码:
1.先序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree Elem[maxsize];
int top;
}SqStack;

void PreOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;

while (p!=null || !StackEmpty(s))
{
while (p!=null) //遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}//endwhile

if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif

}//endwhile

}//PreOrderUnrec

2.中序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree Elem[maxsize];
int top;
}SqStack;

void InOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null || !StackEmpty(s))
{
while (p!=null) //遍历左子树
{
push(s,p);
p=p->lchild;
}//endwhile

if (!StackEmpty(s))
{
p=pop(s);
visite(p->data); //访问根结点
p=p->rchild; //通过下一次循环实现右子树遍历
}//endif

}//endwhile

}//InOrderUnrec


3.后序遍历非递归算法
#define maxsize 100
typedef enum{L,R} tagtype;
typedef struct
{
Bitree ptr;
tagtype tag;
}stacknode;

typedef struct
{
stacknode Elem[maxsize];
int top;
}SqStack;

void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;

do
{
while (p!=null) //遍历左子树
{
x.ptr = p;
x.tag = L; //标记为左子树
push(s,x);
p=p->lchild;
}

while (!StackEmpty(s) && s.Elem[s.top].tag==R)
{
x = pop(s);
p = x.ptr;
visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点
}

if (!StackEmpty(s))
{
s.Elem[s.top].tag =R; //遍历右子树
p=s.Elem[s.top].ptr->rchild;
}
}while (!StackEmpty(s));
}//PostOrderUnrec
jixingzhong 2007-05-29
  • 打赏
  • 举报
回复
貌似 广度优先搜索 不是树的算法?

树的遍历:
http://student.zjzk.cn/course_ware/data_structure/web/shu/shu6.3.1.htm
VCLIFE 2007-05-29
  • 打赏
  • 举报
回复
关注,正准备重看C++,当时都没有好好学

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧