我之前发布了一个与此主题相关的问题,但我也无法解决这个问题。我试图通过键值搜索无序二叉树并通过递归函数返回其关联值。
该课程的格式为:
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...
}
有没有人有任何建议?
答案 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);
}
}