Example #1
0
/* 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];
}
Example #3
0
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;
}