判断无向图是否是树

图是否是树

给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树

您在真实的面试中是否遇到过这个题? 
Yes
 注意事项

你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。

样例

给出n = 5 并且 edges = [[0, 1], [0, 2], [0, 3], [1, 4]], 返回 true.

给出n = 5 并且 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], 返回 false.

class Solution {
public:
    /**
    * @param n an integer
    * @param edges a list of undirected edges
    * @return true if it's a valid tree, or false
    */
    bool validTree(int n, vector>& edges) {
        int len = edges.size();
        if (len != n - 1)
            return false;
        // Write your code here
        vector visited(n, false);
        vector > hasEdge(n, vector(n, false));
 
        for (int i = 0; i < n - 1; ++i) {
            hasEdge[edges[i][0]][edges[i][1]] = true;
            hasEdge[edges[i][1]][edges[i][0]] = true;
        }
        //判断是否有环
        if (!checkRing(0, -1, visited, hasEdge))
            return false;
         
        //以0为起点,若图是连通的且上一步骤未检测到环,则visited数组应该访问过所有节点,否则有任一节点未被访问意味着图非连通
        for (int i = 0; i < n; ++i) {
            if (!visited[i])
                return false;
        }
        return true;
    }
 
    //以currentNode为起点判断是否存在环
    bool checkRing(int currentNode, int preNode, vector& visited, const vector >& hasEdge) {
        visited[currentNode] = true;
        //以currenNode为起点,以[0, n - 1]中的所有节点为终点遍历
        for (int i = 0; i < visited.size(); ++i) {
            if (hasEdge[currentNode][i] && i != preNode) {
                if (visited[i])
                    return false;
                else {
                    if (!checkRing(i, currentNode, visited, hasEdge))
                        return false;
                }
            }
        }
        return true;
    }
};


你可能感兴趣的:(Algorithm)