Tree Operations 打印出有向图中的环

Posted gccbuaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tree Operations 打印出有向图中的环相关的知识,希望对你有一定的参考价值。

题目:

You are given a binary tree with unique integer values on each node. However, the child pointers on each node may point to any other node in the tree including itself, introducing cycles into the binary tree. A cycle is defined when you can traverse back to the same node by following its descendants. Write a function that takes in the root node of the tree and prints out the cycles, if any, in the binary tree. The only operations available on each node are node.left (returns another Node or null), node.right, and node.value (returns the integer value of the node). Pseudocode is fine.

即找出有向图中的环(loop或者cycle),而且所有打印出来。

Example: http://i.imgur.com/7S5fZe5.png

技术分享

cycles: [1, 2, 4], [5], [3,6]


解答:

import java.util.ArrayList;

public class Graph {

    enum VertexState {
        White, Gray, Black
    }
    
    public static void main(String[] args) {
        Node node = new Node(0);
        node.color = VertexState.White;
        Node left = new Node(1);
        left.color = VertexState.White;
        node.left = left;
        Node right = new Node(2);
        right.color = VertexState.White;
        Node rightright = new Node(3);       
        node.right = right;
        left.left = node;
        right.right = rightright;
        rightright.right = node;
        
        ArrayList<Node> list = new ArrayList<Node>();
        ArrayList<ArrayList<Node>> ret = new ArrayList<ArrayList<Node>>();
        rec(node, list, ret);
        System.out.println(ret);
    }

    public static void rec(Node node, ArrayList<Node> list, ArrayList<ArrayList<Node>> ret) {
        if(node.color == VertexState.Gray) {
            ret.add(new ArrayList<Node>(list));
            return;
        }
        node.color = VertexState.Gray;
        list.add(node);
        if(node.left != null && node.left.color != VertexState.Black) {
            rec(node.left, list, ret);
        }
        if(node.right != null && node.right.color != VertexState.Black) {
            rec(node.right, list, ret);
        }
        list.remove(list.size()-1);
        node.color = VertexState.Black;
    }
    
    public static class Node {
        int val;
        Node left;
        Node right;
        VertexState  color;
        public Node(int val_) {
            val = val_;
        }
        @Override
        public String toString() {
            return this.val + "";
        }
    }
}








以上是关于Tree Operations 打印出有向图中的环的主要内容,如果未能解决你的问题,请参考以下文章

codeforces Gym 101572 I 有向图最小环路径

查找有向图中所有的环

有向图和无向图的环检测

打印出整个目录树

[ARC121F]Logical Operations on Tree

Junction Tree algorithm(联结树)的思路整理