这不是家庭作业。我在考虑树遍历中的一些新问题,这似乎很明显,所以想解决它。
问题与 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 将保存最终的 ans。
- 请注意,在压入任何堆栈(S1 或 S2)之前,我们将首先将其排入队列 Q。
- 无论我们从堆栈 s1 中弹出什么,我们都会将其(第一个)右孩子和(然后)左孩子(按此顺序)推入堆栈 s2。(记住第2点)
- 无论我们从堆栈 s2 中弹出什么,我们都会将其(第一个)左孩子和(然后)右孩子(按此顺序)推入堆栈 s1。(记住第2点)
- 从一个堆栈弹出并将其推送到另一个堆栈,直到两个堆栈都为空。Queue 中的最终条目将是 ans。
/*
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.
}
对我来说似乎没问题(如果不是,请告诉我)。但仍然想知道是否还有其他可能的解决方案(比这更好)。