leetcode Graph Valid Tree

Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.

For example:

Given n = 5 and edges = [[0, 1], [0, 2], [0, 3], [1, 4]], return true.

Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.

Show Hint 

    Note: you can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.

    union-find问题的变种,思路和解决union-find的问题几乎是完全一样的,由于树的定义要求图不能出现环路,因此当find出现相同的根时说明出现回路,返回false,另外一棵树只能有一个根,因此可以设置一个计数器判断最后所剩的根即树的个数是否为1:

    private int count;
    private int[] res;
    public boolean validTree(int n, int[][] edges) {
        res=new int[n];
        for(int i=0;i<n;i++)
            res[i]=i;
        count=n;
        for(int i=0;i<edges.length;i++){
            int left=find(res,edges[i][0]);
            int right=find(res,edges[i][1]);
            if(left==right) return false;
            res[left]=right;
            count--;
        }
        return count==1;
    }
    public int find(int[]res,int i){
        while(res[i]!=i) i=res[i];
        return i;
    }

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值