void tree_dfs(Node node, int mode) { /** * Printeaza arborele in functie de mod: * 0 - preordine * 1 - inordine * 2 - postordine */ if (!node) return; if (mode == 0) printf("%c ", node->key); tree_dfs(node->left, mode); if (mode == 1) printf("%c ", node->key); tree_dfs(node->right, mode); if (mode == 2) printf("%c ", node->key); }
/* * Checks if the given decomposition constitutes a tree using DFS */ bool is_tree() { if ((num_vertices > 0) && num_vertices - 1 != num_edges) { return false; } else if (num_vertices == 0) { return (num_edges == 0); } std::vector<int> seen(num_vertices, 0); unsigned seen_size = 0; bool cycle = !tree_dfs(seen,0,-1,seen_size); if (cycle || seen_size != num_vertices) { return false; } return true; }
/* * Helper method for is_tree(); not to be called from outside of the class */ bool tree_dfs(std::vector<int>& seen, unsigned root, unsigned parent, unsigned& num_seen) { if (seen[root] != 0) { return false; } seen[root] = 1; num_seen++; for (auto it = adj_list[root].begin(); it != adj_list[root].end(); it++) { if (*it != parent) { if (!tree_dfs(seen, *it, root,num_seen)) { return false; } } } return true; }