let clean tree =
    let graph = graph_from_tree tree
    in let graph_beginnings = findBeginnings (nodelist graph)
    in let nodes = IdtMap.fold (fun _ x y -> x::y) tree.treeNodes []
    in let rec clean_nodes node_list tre =
          match node_list with
            x::tail -> let old_children = List.filter (fun y -> has_edge_id x.node.id y tre) x.children
                      in let out_edges = DG.nodefoldoutedges graph (fun y a -> y::a) x.node []
                      in let targets = List.map (fun (_,tt,_) -> tt.id) out_edges
                      in let new_children = List.filter (fun y -> not (List.mem y old_children)) targets
                      in let node_children = List.concat [old_children;new_children]
                      in clean_nodes tail {tre with treeNodes = IdtMap.add x.node.id {x with allDone = false; number = NodeNumber.invalid_num; children = node_children} (IdtMap.remove x.node.id tre.treeNodes)}
          | _ -> tre
    in let tree2 = clean_nodes nodes tree
    in let edges = IdtMap.fold (fun _ x y -> x::y) tree.treeEdges []
    in let rec clean_edges edge_list tre =
          match edge_list with
            x::tail -> let (c,_,_) = x.edge
                    in clean_edges tail {tre with treeEdges =IdtMap.add c.nameforudg {x with used = false; edgeway = Unknown} (IdtMap.remove c.nameforudg tre.treeEdges)}
          | _ -> tre
    in let tree3 = clean_edges edges tree2
    in let old_starting = List.filter (fun x -> List.mem x graph_beginnings) tree.starting_places
    in let new_starting = List.filter (fun x -> not (List.mem x tree.starting_places)) graph_beginnings
    in {tree3 with starting_places = List.concat [old_starting;new_starting]}