使用C ++的二进制搜索树中的第N个元素

时间:2015-10-25 20:47:42

标签: c++ algorithm binary-search-tree

我试图使用按顺序遍历在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>;

};

2 个答案:

答案 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);
}