lintcode(178)图是否是树

本文介绍了一个算法,用于判断由节点和无向边组成的图是否构成一棵树。通过检查边的数量是否等于节点数量减一,并确保所有节点可达来实现。

描述:

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

样例:

给出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.


思路:

树的两个特点(1)边的数量等于节点的数量-1  (2)每个节点都可以访问到

所以首先判断边数然后判断每个节点是否都可以访问的到。

public class Solution {
    /**
     * @param n an integer
     * @param edges a list of undirected edges
     * @return true if it's a valid tree, or false
     * 建立一个表来存储各个节点的关系
     */
    public boolean validTree(int n, int[][] edges) {
        // Write your code here
        if(edges.length != n - 1){
            return false;
        }
        int[][] temp = new int[n][n];
        for(int i = 0;i<edges.length;i++){
            int p = edges[i][0];
            int q = edges[i][1];
            temp[p][q] = 1;
            temp[q][p] = 1;
        }
        boolean[] visit = new boolean[n];
        for(int i = 0;i<n;i++){
            visit[i] = false;
        }
        search(visit , temp , 0);
        for(int j = 0;j<n;j++){
            if(!visit[j]){
                return false;
            }
        }
        return true;
    }
    public void search(boolean[] visit , int[][] temp , int current){
        visit[current] = true;
        for(int i = 0;i<temp.length;i++){
            if(temp[current][i] == 1 && visit[i] == false){
                search(visit , temp , i);
            }
        }
    }
}


### LintCode平台上出现Wrong Answer的原因及解决方法 在LintCode平台上,出现`Wrong Answer`通常是由于代码逻辑错误、边界条件未处理或平台环境差异等原因导致。以下是可能导致`Wrong Answer`的常见原因及其解决方法: #### 1. **代码逻辑错误** - 如果代码中存在逻辑错误,例如引用中的`ZigZag Conversion`问题[^2],程序可能在某些特定输入下产生错误结果。 - 解决方法:仔细检查算法逻辑,确保所有情况都被正确处理。例如,在`ZigZag Conversion`问题中,需要明确行数和字符串长度的关系,并正确计算每个字符的位置。 #### 2. **边界条件未处理** - 边界条件是导致`Wrong Answer`的常见原因之一。例如,在`a+b`问题中[^3],如果未考虑`b=0`的情况,可能会导致错误结果。 - 解决方法:针对边界条件进行专项测试。例如,对于加法问题,可以测试以下用例: ```python # 测试用例 a = 0, b = 0 # 零值 a = -1, b = 1 # 负数与正数 a = 1, b = -1 # 正数与负数 ``` #### 3. **平台环境差异** - 平台环境差异也可能导致`Wrong Answer`。例如,引用中提到的`JDK1.8`与`JDK1.7`之间的差异[^2],可能导致相同代码在不同环境中输出不同结果。 - 解决方法:尽量使用平台推荐的编程语言版本,并避免依赖特定版本的行为。如果怀疑是环境问题,可以在本地模拟平台环境进行测试。 #### 4. **时间复杂度或空间复杂度不符合要求** - 某些题目对时间复杂度或空间复杂度有严格要求。例如,在`O(1)`时间复杂度删除链表节点问题中[^4],如果未满足时间复杂度要求,可能会被视为错误。 - 解决方法:确保代码的时间复杂度和空间复杂度符合题目要求。例如,对于链表删除问题,可以通过修改当前节点的值和指针来实现`O(1)`时间复杂度。 #### 5. **代码风格或语法问题** - 某些平台对代码风格或语法有严格要求。例如,引用中的`xor`问题[^3]可能是由于关键字冲突或函数名命名问题导致。 - 解决方法:遵循平台的代码规范,避免使用可能引起冲突的关键字或函数名。 #### 示例代码修正 以下是一个修正后的`a+b`问题代码示例,确保逻辑正确并避免潜在冲突: ```cpp int aplusb(int a, int b) { while (b != 0) { int carry = (unsigned)(a & b) << 1; // 处理进位 a = a ^ b; // 不进位加法 b = carry; // 更新进位 } return a; } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值