patterncppModerate
Finding the maximum value in a binary tree
Viewed 0 times
themaximumvaluebinaryfindingtree
Problem
I have to find the maximum value in a binary tree. This is how I did it iteratively:
I don't know if this is the best way to do it. How can this be improved? Is there a recursive solution?
int maxValue(Node* node)
{
if (node == nullptr)
throw "BT is empty";
int max = node->data;
for (Node* left = node; left != nullptr; left = left->left)
{
if (left->data > max)
max = left->data;
}
for (Node* right = node; right != nullptr; right = right->right)
{
if (right->data > max)
max = right->data;
}
return max;
}I don't know if this is the best way to do it. How can this be improved? Is there a recursive solution?
Solution
Trees are often most useful when they're sorted. If the tree is sorted, you can just descend into the right side of the tree.
Since we're assuming an unsorted tree, we have to search the whole thing. Let's build this up by cases. First assume that the current node has the largest value:
Nice, but not likely. We can do better. What if the largest value is in the left side of the tree?
Great! Now we have a function that will check its left side for larger values, all the way down the left side. But what if the largest value is on the right of some node? We'd better cover that case too:
Now since we only have to check for NULL that will throw on the first node we can optimize slightly:
That should do it.
Since we're assuming an unsorted tree, we have to search the whole thing. Let's build this up by cases. First assume that the current node has the largest value:
int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
max = node->data;
return max;
}Nice, but not likely. We can do better. What if the largest value is in the left side of the tree?
int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
max = node->data;
if(node->left != nullptr) {
int leftMax = maxValue(node->left);
if(max < leftMax)
max = leftMax;
}
return max;
}Great! Now we have a function that will check its left side for larger values, all the way down the left side. But what if the largest value is on the right of some node? We'd better cover that case too:
int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
int max = node->data;
if(node->left != nullptr) {
int leftMax = maxValue(node->left);
if(max right != nullptr) {
int rightMax = maxValue(node->right);
if(max < rightMax)
max = rightMax;
}
return max;
}Now since we only have to check for NULL that will throw on the first node we can optimize slightly:
int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
return maxValueNonNull(node, node->data);
}
int maxValueNonNull(Node* node, int currentMax)
{
if (node == NULL)
{ return currentMax;
}
currentMax = currentMax > node->data ? currentMax : node->data;
int leftMax = maxValueNonNull(node->left, currentMax);
int rightMax = maxValueNonNull(node->right, currentMax);
return leftMax > rightMax ? leftMax : rightMax;
}That should do it.
Code Snippets
int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
max = node->data;
return max;
}int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
max = node->data;
if(node->left != nullptr) {
int leftMax = maxValue(node->left);
if(max < leftMax)
max = leftMax;
}
return max;
}int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
int max = node->data;
if(node->left != nullptr) {
int leftMax = maxValue(node->left);
if(max < leftMax)
max = leftMax;
}
if(node->right != nullptr) {
int rightMax = maxValue(node->right);
if(max < rightMax)
max = rightMax;
}
return max;
}int maxValue(Node *node)
{
if (node == nullptr)
throw "BT is empty";
return maxValueNonNull(node, node->data);
}
int maxValueNonNull(Node* node, int currentMax)
{
if (node == NULL)
{ return currentMax;
}
currentMax = currentMax > node->data ? currentMax : node->data;
int leftMax = maxValueNonNull(node->left, currentMax);
int rightMax = maxValueNonNull(node->right, currentMax);
return leftMax > rightMax ? leftMax : rightMax;
}Context
StackExchange Code Review Q#71331, answer score: 11
Revisions (0)
No revisions yet.