/* Find all the leaf nodes */ void findLeaves(struct node* node, int level) { if (node->left == NULL && node->right == NULL) { node->level = level; array[++index] = node; } level++; if (node->left != NULL) findLeaves(node->left, level); if (node->right != NULL) findLeaves(node->right, level); }
int height(std::vector<std::unordered_set<int>> &children, const std::vector<int> parents) { int root = findRoot(parents); std::vector<int> leaves = findLeaves(children), subtreeHeight(parents.size(), 1); while (!leaves.empty()) { std::vector<int> newLeaves; for (int nextLeaf: leaves) { int nextParent = parents.at(nextLeaf); if (nextParent == -1) { continue; } subtreeHeight[nextParent] = subtreeHeight[nextLeaf] + 1; children[nextParent].erase(nextLeaf); if (children[nextParent].empty()) { newLeaves.push_back(nextParent); } } leaves = newLeaves; } return subtreeHeight[root]; }
int findDeepestRight(struct node *root) { index = -1; findLeaves(root, 1); int i; struct node* deepestRight = NULL; for (i = 0; i <= index; i++) if (deepestRight == NULL || deepestRight->level <= array[i]->level) deepestRight = array[i]; return deepestRight->no; }