Wakka Wakka Wakka Wakka Wakka Wakka - 1 year ago 46
C++ Question

How to create a function that returns smallest value of an unordered binary tree

This seems like it should be really easy but I've been having trouble with this for quite some time. As the title says, I'm just trying to find the node in a Binary tree (not a BST!) with the smallest value and return it. I can write a recursive void function pretty easily that can at least assign the smallest value in the function, but I'm getting stuck on how to back track to previous nodes once I reach a NULL pointer.

I have a node class that has a pointer to a left and right child, each with its own value. Here is my (failed) attempt so far:

int preOrder(Node *node, int value, int count, int sizeOfTree)
count++; //keeps track of whether or not we have traversed the whole tree

if(value < node->getValue())
value = node->getValue();

if(count == sizeOfTree);
return value;

if(node == NULL)
//Want to return to the previous function call
//How do I do this for a non void function?
//for a void function, you could jsut type "return;" and the function
//back tracks to your previous place in the tree
//but since I'm returning a value, How would I go about doing this?

//these 2 calls are incorrect but the idea is that I first traverse the left subtree
//followed by a traversal of the right subtree.
preOrder(node->getLeft(), value);

preOrder(node->getRight(), value);


If possible, I would like to try and do this without keeping track of a "count" as well to make the code cleaner.
Let me know if anymore clarification is needed.

Thanks for any help!

Answer Source

I don't really understand why, in your original code, you need to keep track of the amount of elements traversed. Here is my solution:

int find_min(Node* node)
  int value = node->getValue()

  Node* left_node = node->getLeft();
  if (left_node != NULL)
    int left_value = find_min(left_node);
    if (left_value < value)
      value = left_value;

  Node* right_node = node->getRight();
  if (right_node != NULL)
    int right_value = find_min(right_node);
    if (right_value < value)
      value = right_value;

  return value;
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download