Leetcode 1361. Verify Binary Tree DFS/BFS/Union Search

Original title link:
insert image description here
insert image description here
insert image description here

DFS

class Solution {
    
    
public:
    vector<vector<int>> adj;
    vector<int> visit;
    int num=0;
    void dfs(int now)
    {
    
    
        visit[now]=1;
        num++;
        for(auto x:adj[now])
        {
    
    
            if(!visit[x]) dfs(x);
        }
    }
    bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
    
    
        vector<int> indegree(n);
        adj.resize(n);
        visit.resize(n);
        for(int i=0;i<leftChild.size();i++)
        {
    
    
            if(leftChild[i]!=-1)
            {
    
    
                adj[i].push_back(leftChild[i]);
                indegree[leftChild[i]]++;
            }
        }
        for(int i=0;i<rightChild.size();i++)
        {
    
    
            if(rightChild[i]!=-1)
            {
    
    
                adj[i].push_back(rightChild[i]);
                indegree[rightChild[i]]++;
            }
        }
        int num0=0,root=-1;
        for(int i=0;i<n;i++)
        {
    
    
            if(indegree[i]==0)  
            {
    
    
                num0++;
                root=i;
            }
            if(indegree[i]>1 || num0>1) return false;
        }
        if(num0==0) return false;
        dfs(root);
        return num==n;
    }
};

BFS

class Solution {
    
    
public:
    vector<vector<int>> adj;
    vector<int> visit;
    bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
    
    
        vector<int> indegree(n);
        adj.resize(n);
        visit.resize(n);
        for(int i=0;i<leftChild.size();i++)
        {
    
    
            if(leftChild[i]!=-1)
            {
    
    
                adj[i].push_back(leftChild[i]);
                indegree[leftChild[i]]++;
            }
        }
        for(int i=0;i<rightChild.size();i++)
        {
    
    
            if(rightChild[i]!=-1)
            {
    
    
                adj[i].push_back(rightChild[i]);
                indegree[rightChild[i]]++;
            }
        }
        int num0=0,root=-1;
        for(int i=0;i<n;i++)
        {
    
    
            if(indegree[i]==0)  
            {
    
    
                num0++;
                root=i;
            }
            if(indegree[i]>1 || num0>1) return false;
        }
        if(num0==0) return false;
        queue<int> q; q.push(root);
        visit[root]=1;
        int num=1;
        while(!q.empty())
        {
    
    
            int now=q.front(); q.pop();
            for(auto x:adj[now])
            {
    
    
                if(!visit[x]) 
                {
    
    
                    num++;
                    visit[x]=1; q.push(x);
                }
            }
        }
        return num==n;
    }
};

And lookup

class Solution {
    
    
public:
    map<int,int> father;
    int findfather(int x)
    {
    
    
        int a=x;
        while(x!=father[x]) x=father[x];
        while(a!=father[a])
        {
    
    
            int z=a;
            a=father[a];
            father[z]=x;
        }
        return x;
    }
    void Union(int a,int b)
    {
    
    
        int fa=findfather(a);
        int fb=findfather(b);
        if(fa!=fb) father[fb]=fa;
    }
    bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
    
    
        vector<int> indegree(n);
        for(int i=0;i<n;i++) father[i]=i;
        for(int i=0;i<leftChild.size();i++)
        {
    
    
            if(leftChild[i]!=-1)
            {
    
    
                indegree[leftChild[i]]++;
                Union(i,leftChild[i]);
            }
        }
        for(int i=0;i<rightChild.size();i++)
        {
    
    
            if(rightChild[i]!=-1)
            {
    
    
                indegree[rightChild[i]]++;
                Union(i,rightChild[i]);
            }
        }
        int num0=0,root=-1;
        for(int i=0;i<n;i++)
        {
    
    
            if(indegree[i]==0)  
            {
    
    
                num0++;
                root=i;
            }
            if(indegree[i]>1 || num0>1) return false;
            findfather(i);
        }
        if(num0==0) return false;
        for(int i=0;i<n;i++) if(father[i]!=root) return false;
        return true;
    }
};

Guess you like

Origin blog.csdn.net/qq_45791939/article/details/128024399
Recommended