Это не домашняя работа. Я думал о некоторых новых вопросах обхода дерева, и это кажется очень очевидным, поэтому подумал о его решении.
Вопрос очень похож на прохождение порядка уровней, как BFS. В BFS мы обычно движемся слева направо на каждом уровне дерева, но здесь, если мы путешествуем слева направо на уровне i, то уровни (i-1) и (i + 1) необходимо перемещать справа налево.
Например:
2
/ \
7 5
/ \ \
2 6 9
/ \ \
5 11 4
В обычном BFS мы выводим: 2, 7, 5, 2, 6, 9, 5, 11, 4
Но я ищу решение, где мы выводим: 2, 5, 7, 2, 6, 9, 4, 11, 5
Я могу найти решение. Но я хочу посмотреть, найдется ли у кого-нибудь лучшее решение, чем у меня. Я особенно ищу оптимизацию в отношении сложности пространства (размер стека).
Пожалуйста, дайте свою логику в соответствии с языком C ++. Я буду очень признателен, если вы не будете использовать какие-либо контейнеры или STL в своем решении.
Основываясь на комментариях, я нашел решение с использованием двух стеков. Мое решение, как показано ниже.
- Создание стека S1 и S2 и очереди Q. В очереди Q будут храниться последние ответы.
- Обратите внимание, что перед добавлением любого стека (S1 или S2) мы сначала поместим его в очередь Q.
- Что бы мы ни извлекали из стека s1, мы поместим его (первого) правого потомка и (затем) левого потомка (в этом порядке) в стек s2. (Помните пункт 2)
- Что бы мы ни извлекали из стека s2, мы поместим его (первого) левого потомка и (затем) правого потомка (в этом порядке) в стек s1. (Помните пункт 2)
- Выскочите из одной стопки и переместите ее в другую, пока обе стопки не опустеют. окончательные записи в очереди будут отвечать.
/*
Create Stack S1, S2; // for tmp itr. Both of size log<n>
Create Queue Q; // It will hold ans
*/
Q.enqueue(root); //Enqueue the root nood;
S1.enqueue(root); //Fill the stack with somthing to start.
while(S1||S2){ // keep spinning untill both stack are empty.
while(s1){ //take care of stack S1.
Node* tmp = S1.pop(); //take top elem;
if(tmp->right){
Q.enqueue(tmp->right);
S2.push(tmp->right);
}
if(tmp->left){
Q.enqueue(tmp->left);
S2.push(tmp->left);
}
}
while(S2){ //while S2 is not empty
Node* tmp = S2.pop();
if(tmp->left){
Q.enqueue(tmp->left);
S1.push(tmp->left);
}
if(tmp->right){
Q.enqueue(tmp->right);
S1.push(tmp->right);
}
}
} //End of outher while
while(Q){
cout<< Q.pop()->data; //output the entries in desired format.
}
Мне кажется, хорошо (дайте мне знать, если это не так). Но все еще задаюсь вопросом, может ли быть какое-либо другое возможное решение (лучше, чем это).