1

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

该类具有以下形式:

  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...
}

有人有建议吗?

4

3 回答 3

2

干得好。这包括回答您最后一个问题的代码,已修改为支持键/值节点而不仅仅是值节点。此外,通过这些更改,返回指向节点的指针而不是它包含的值是有意义的,所以我更新最低也是这样做的。

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

于 2012-07-30T23:21:36.890 回答
0

是的,你很接近。当您没有找到钥匙时,您需要弄清楚要返回什么,因为这就是阻止您完成的原因。请注意,如果左节点不为 NULL,您将永远不会检查右节点。

于 2012-07-30T23:05:08.960 回答
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); 
       }     
    }
于 2012-07-30T23:07:04.147 回答