Идея очень проста: обходить дерево в порядке убывания значений каждого узла. Когда вы достигнете N-го узла, выведите значение этого узла. Вот рекурсивный код.
void printNthNode(Node* root, int N)
{
if(root == NULL)
return;
static int index = 0; //These will initialize to zero only once as its static
//For every Node go to the right of that node first.
printNthNode(root->right, N);
//Right has returned and now current node will be greatest
if(++index == N)
{
printf("%d\n", root->data);
return;
}
//And at last go to the left
printNthNode(root->left, N);
}
Редактировать -
Согласно комментариям ниже, похоже, что это одноразовая функция вызова из-за статической локальной переменной. Это можно решить, передав объект-оболочку для index
следующим образом:
class WrapIndex {
public: int index;
};
и сигнатура метода изменится на
void printNthNode(Node* root, int N, WrapIndex wrapInd)
Теперь нам не нужна локальная статическая переменная; вместо этого используйте index
объекта-оболочки. Вызов будет выглядеть как
WrapIndex wrapInd = new WrapIndex();
wrapInd.index=0;
printNthNode(root,7,wrapInd);
wrapInd.index=0;
printNthNode(root,2,wrapInd);