尝试在 C 中为普通树构建广度优先搜索算法
Try to build a Breadth First Search algorithm for normal tree in C
我尝试为普通树建立一个广度优先搜索算法,一个节点可以有多个(可以超过两个)children。
我算法的 主要思想 是我遍历所有 first-kid,然后通过 get()
函数递归地遍历它们的 right-brother。所有结果都存储在二维 *char 数组 arr
.
中
- 一路走下去:
row++;col=0
- 兄弟们走对了:
col++
- 往上重复步骤2。
(好像我把father和children存到二维数组的时候失去了关系,怎么保持呢)
如果一切顺利(实际上不是,gcc 报告没有问题但没有输出),输出应该是这样的:
A
B C D
E F G
树结构:
struct node *head;
struct node {
struct node *firstKid;
struct node *rightBro;
char *token;
};
主function:I忽略creat-tree函数,因为所有参数都是从另一个程序传递的。
int main() {
int m=100,n=100;
// creat-tree function ignored here, the root of the tree would be head(used in get()func
char ***arr = (char ***)malloc(n*sizeof(char **));
for(int i=0;i<n;i++) arr[i] = (char **)malloc(m*sizeof(char*));
get(head,0,0,arr);
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
printf("%s",arr[i][j]);
}
}
}
我的迭代器:
void get(struct node *node,int row,int col,char ***arr){
struct node *kid;
struct node *bro;
if(node!=NULL){
arr[row][col]=node->token;
row=row+1;col=0;
if(node->firstKid)get(node->firstKid,row,col,arr);
else{
bro = node->rightBro;
while(bro!=NULL){
col ++;
arr[row][col]=bro->token;
bro = node->rightBro;
}
}
}
}
Breadth-first遍历:
- 创建一个 to-visit 队列。
- 将根添加到队列。
- 虽然队列不为空,
- 使一个节点出队。
- 访问出队节点。
- 将节点的子节点添加到队列中。
搜索是一样的,除了一旦找到感兴趣的节点就退出循环。
您没有队列(或任何用于此目的的队列)。你的一般方法是有缺陷的。事实上,您正在通过使用堆栈(通过递归)而不是队列来执行部分 depth-first 遍历。
我没有解决具体问题,因为您必须重写代码,而且您未能提供问题的演示。
我尝试为普通树建立一个广度优先搜索算法,一个节点可以有多个(可以超过两个)children。
我算法的 主要思想 是我遍历所有 first-kid,然后通过 get()
函数递归地遍历它们的 right-brother。所有结果都存储在二维 *char 数组 arr
.
- 一路走下去:
row++;col=0
- 兄弟们走对了:
col++
- 往上重复步骤2。
(好像我把father和children存到二维数组的时候失去了关系,怎么保持呢) 如果一切顺利(实际上不是,gcc 报告没有问题但没有输出),输出应该是这样的:
A
B C D
E F G
树结构:
struct node *head;
struct node {
struct node *firstKid;
struct node *rightBro;
char *token;
};
主function:I忽略creat-tree函数,因为所有参数都是从另一个程序传递的。
int main() {
int m=100,n=100;
// creat-tree function ignored here, the root of the tree would be head(used in get()func
char ***arr = (char ***)malloc(n*sizeof(char **));
for(int i=0;i<n;i++) arr[i] = (char **)malloc(m*sizeof(char*));
get(head,0,0,arr);
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
printf("%s",arr[i][j]);
}
}
}
我的迭代器:
void get(struct node *node,int row,int col,char ***arr){
struct node *kid;
struct node *bro;
if(node!=NULL){
arr[row][col]=node->token;
row=row+1;col=0;
if(node->firstKid)get(node->firstKid,row,col,arr);
else{
bro = node->rightBro;
while(bro!=NULL){
col ++;
arr[row][col]=bro->token;
bro = node->rightBro;
}
}
}
}
Breadth-first遍历:
- 创建一个 to-visit 队列。
- 将根添加到队列。
- 虽然队列不为空,
- 使一个节点出队。
- 访问出队节点。
- 将节点的子节点添加到队列中。
搜索是一样的,除了一旦找到感兴趣的节点就退出循环。
您没有队列(或任何用于此目的的队列)。你的一般方法是有缺陷的。事实上,您正在通过使用堆栈(通过递归)而不是队列来执行部分 depth-first 遍历。
我没有解决具体问题,因为您必须重写代码,而且您未能提供问题的演示。