作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这不是家庭作业。我在考虑树遍历中的一些新问题,这似乎很明显所以想解决它。
问题与 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,我将不胜感激。
根据此处的评论,我想出了一个使用两个堆栈的解决方案。我的解决方案如下。
/*
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.
}
我觉得还可以(如果不行请告诉我)。但仍然想知道是否有任何其他可能的解决方案(比这更好)。
最佳答案
与其使用单个队列,不如使用一对堆栈。当当前堆栈为空时,开始从另一个堆栈中弹出节点,并将它们的子节点推到现在为空的堆栈中。
所以你有
等等
您还需要一个状态变量来决定是先向左推还是向右推。
关于c++ - 二叉树上的左右 BFS 遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867247/
我是一名优秀的程序员,十分优秀!