我试图使用按顺序遍历在BST中找到第N个元素。我已将这些节点插入到我的BST中:5,2,6,7,3,1。当我在寻找第三个元素时,它给了我另一个节点。
这是我在BST中的第n个元素的代码(按顺序遍历):
element.bind('remove', function() {
alert("Element remove handler called.");
});
这是一个节点:
template <class Comparable>
BinaryNode<Comparable>* AugmentedBinarySearchTree<Comparable>::
NthElement(BinaryNode<Comparable> *t, int *nodesVisited, int n) const
{
//BinaryNode<Comparable>* temp = new BinaryNode<Comparable>();
if(t !=NULL)
{
if (*nodesVisited == n)
{
return t;
}else
{
cout << "going left \n";
NthElement(t->left, nodesVisited, n);
cout << "visited element= " << t->element << " nodes= " << *nodesVisited <<endl;
cout << "going right \n";
if (*nodesVisited < n)
{
(*nodesVisited)++;
NthElement(t->right, nodesVisited, n);
}
else if(*nodesVisited == n)
{
return t;
}
}
}
}
它给了我这个结果:
template <class Comparable>
class BinaryNode
{
Comparable element;
BinaryNode *left;
BinaryNode *right;
int m_size;
BinaryNode(const Comparable & theElement = -1, BinaryNode *lt = NULL, BinaryNode *rt = NULL, int size = -1)
: element(theElement), left(lt), right(rt), m_size(size) { }
friend class AugmentedBinarySearchTree<Comparable>;
friend class BinarySearchTree<Comparable>;
};
答案 0 :(得分:1)
我认为以下是一种更简单的方法:
node* findNodeN(node* head, int* nodesVisited, int n) {
if (head->lt) {
node* temp = findNodeN(head->lt, nodesVisited, n);
if (temp) return temp;
}
if (*nodesVisited == n) return head;
++(*nodesVisited);
if (head->rt) {
node* temp = findNodeN(head->rt, nodesVisited, n);
if (temp) return temp;
}
return nullptr;
}
答案 1 :(得分:0)
你忽略了问题的一个重要部分。您必须有一种方法可以在递归搜索过程中停止以返回结果。至少有两种方法可以解决这个问题。您可以退回&#34;失败&#34;值(如NULL
)并测试它以确定搜索还没有成功,所以继续。或者你可以像往常一样继续并抛出异常来一步展开递归。这是第一种方法:
template <class Comparable>
BinaryNode<Comparable>* AugmentedBinarySearchTree<Comparable>::
NthElement(BinaryNode<Comparable> *root, int *nodesVisited, int n) const
{
if (!root) return NULL;
BinaryNode<Comparable> *left = NthElement(root->left, nodesVisited, n);
if (left) return left; // Node found in left subtree. Stop searching.
if (++(*nodesVisited) >= n) return root; // Count and skip right subtree if found.
return NthElement(root->right, nodesVisited, n);
}