按键值搜索无序二叉树

时间:2012-07-30 22:58:27

标签: c++ tree binary-tree

我之前发布了一个与此主题相关的问题,但我也无法解决这个问题。我试图通过键值搜索无序二叉树并通过递归函数返回其关联值。

该课程的格式为:

  Class Node
  {
     private:
       Node *leftChild;
       Node *rightChild;
       int key;
       int value;
 }

每个变量都有关联的get方法。所以我基本上想要搜索二叉树并在到达正确的节点后返回它的值。

到目前为止,这是我的尝试,我认为我非常接近:

int preOrder(Node *node, int key)
{
   if(node->getKey() == key)
     return node->getValue();

  Node* leftNode = node->getLeft();

  if(leftNode != NULL)
  {
    return preOrder(leftNode, key);
  }

  Node* rightNode = node->getRight();

  if(rightNode != NULL)
  {
    return preOrder(rightNode, key);
  }

  //I know a return statement needs to be placed here
  //in case both pointers are NULL in order to return to the previous
  //node in the tree, but I'm not sure how to do this...
}

有没有人有任何建议?

3 个答案:

答案 0 :(得分:2)

你走了。这包括回答上一个问题的代码,修改为支持Key / Value节点而不仅仅是Value节点。此外,通过更改,返回指向节点的指针而不是它包含的值是有意义的,所以我更新了最低也是这样做的。

template <typename KeyT, typename ValueT>
class Node
{
public:
    Node(KeyT k, ValueT v)
    {
        key = k;
        value = v;
        right = NULL;
        left = NULL;
    }

    Node<KeyT, ValueT> * lowest()
    {
        Node<KeyT, ValueT> * v = this;

        if (right != NULL)
            if (v->value > left->value) v = left;
        if (left  != NULL)
            if (v->value > right->value) v = right;

        return v;
    }

    Node<KeyT, ValueT> * searchByKey(KeyT k)
    {
        if (key == k)
            return this;

        Node<KeyT, ValueT> * n = NULL;

        if (left != NULL)
            n = left->searchByKey(k);
        if (n != NULL) return n;
        if (right!= NULL)
            n = right->searchByKey(k);
        if (n != NULL) return n;

        return NULL;
    }

    Node<KeyT, ValueT> * getRight()
    {
        return right;
    }

    Node<KeyT, ValueT> * getLeft()
    {
        return left;
    }

    void setRight(Node<KeyT, ValueT> * nright)
    {
        right = nright;
    }

    void setLeft(Node<KeyT, ValueT> * nleft)
    {
        left = nleft;
    }

    KeyT getKey()
    {
        return key;
    }

    ValueT getValue()
    {
        return value;
    }

private:
    KeyT   key;
    ValueT value;

    Node<KeyT, ValueT> * right;
    Node<KeyT, ValueT> * left;
};

查看示例输出:http://ideone.com/l5ZNc

答案 1 :(得分:0)

是的,你很亲密。当你没找到钥匙时,你需要弄清楚要返回什么,因为这是阻止你完成的原因。请注意,如果左侧节点不是NULL,则您永远不会检查正确的节点。

答案 2 :(得分:0)

    int value=NULL;
    void preOrder(Node *node, int key)
    {
       if (node!=NULL){
          if(node->getKey() == key)
            value=node->getValue();

          preOrder(node->getLeft(),key);
          preOrder(node->getRight(),key); 
       }     
    }