c - 编辑我的代码以了解输入是否是二叉树

标签 c graph-theory depth-first-search

我有一个程序,它接受邻接矩阵作为输入,然后计算相应的图是否是树。我想修改它,以便它确定该图是否是特定的二元树,但我真的无法理解它。我需要做什么?

原始代码如下:

#include<stdio.h>
#include<stdlib.h>

int A[20][20]; // Our two-dimensional array.
int visited[20];
int v = 0;
int count = 0;
int n;
int seq[20];
int s = 0;
int connected = 1;
int acyclic = 1;

// Declaration of the DFS function
void DFS();

// Declaration of the DFSearch function
void DFSearch(int cur);

int main() {
    int i,j;

    printf("\nStep 1 of 2 — Fill in your desired number of vertices: ");
    scanf("%d",&n);

    printf("\nStep 2 of 2 — Fill in the adjacency matrix(1/0):\n");

    for(i=1;i<=n;i++) {
            for(j=1;j<=n;j++) {
        scanf("%d",&A[i][j]);
        }
    }

    printf("\nThe DFS traversal shows:\n");

    DFS();

    for(i=1; i<=n; i++) {
        printf("%c,%d\t", 'a'+seq[i]-1, i);
    }

    if(connected && acyclic) {
            printf("\n\nThis is a connected and non-cyclic graph. Therefore, it IS a tree.");
    }

    if(!connected && acyclic) {
            printf("\n\nThis is a non-connected and non-cyclic graph. Therefore, it is NOT a tree.");
    }

    if(connected && !acyclic) {
        printf("\n\nThis is a connected and cyclic graph. Therefore, it is NOT a tree.");
    }

    if(!connected && !acyclic) {
            printf("\n\nThis is a non-connected and cyclic graph. Therefore, it is NOT a tree.");
    }
    printf("\n\n");
    return 0;
}

// Definition of the DFS function
void DFS() {
    int i;

    for(i=1; i<=n; i++) {
        if(!visited[i]) {
                if(i>1) {
                    connected = 0;
                    DFSearch(i);
                }
        }
    }
}

// Definition of the DFSearch function
void DFSearch(int cur) {
    int i,j;

    visited[cur]=++count;

    seq[count]=cur;

    for(i=1; i<count-1; i++) {
            if(A[cur][seq[i]]) {
                acyclic = 0;
            }
    }

    for(i=1; i<=n; i++) {
        if(A[cur][i] && !visited[i]) {
           DFSearch(i);
        }
    }
}

最佳答案

二叉树与其他树有何区别?想必您知道,正是没有一个节点具有超过一个父节点或两个以上子节点。当然,区分父节点和子节点需要一个有向图,或者至少是一个有序图。这与树是非循环的一般属性相结合,意味着二叉树也是 Root过的。

现在,有向图自然受到您正在使用的邻接矩阵表示的支持,所以这没有问题。事实上,邻接矩阵表示对于无向图来说有点不自然,但是您可以通过将它们表示为对称邻接矩阵来很好地服务这些。

遵循程序的范例,然后,我建议添加一个变量

int binary = 1;

并在检查每个节点时测试该节点是否具有两个以上的传出边(因此,是否有两个以上的子节点)。如果找到一个节点,则将变量设置为零,表明虽然该图可能是一棵树,但它不是二元树。

当然,要做到这一点需要充分分析程序以了解其工作原理。我不会剥夺您宝贵的经验,但也许我指出该计划比问题所暗示的更具体一点会对我有所帮助。它通常不计算提供的邻接矩阵是否对应于树,而是计算矩阵是否对应,

  • 解释为有向图的表示,
  • 对应于以第一个节点为根的树。

关于c - 编辑我的代码以了解输入是否是二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46550701/

相关文章:

algorithm - 使用最小优先级队列时,如何跟踪 Dijkstra 算法中的最短路径?

c++ - Boost 图形库中的其他中心性度量

java - 从展平 DFS 结构创建递归结构

c - 无法执行C代码

c - 为什么EPOLLOUT没有被触发?

c - '!'在输入缓冲区中与 if 语句中的比较

c - 使用 for 循环插入二叉搜索树 (C)

Python:如何将列表列表的元素转换为无向图?

java - DFS 益智游戏解算器 (java)

c++ - SPOJ KFSTB - 帮助总司令 : Wrong Answer