问题描述
如果我们说的话,是一棵深度为2的树
6 <- depth = 0
/ \
/ \
4 9 <- depth = 1
/ \ \
3 5 10 <- depth = 2
我只想打印第二级,所以3、5和10(按此顺序),我将如何去做?我使用的是我为顺序遍历编写的代码,但我停留在如何跟踪树的深度并在达到该深度时进行打印。
void printLevelNodesHelper(MovieNode * curr,int level){ //helper function
int lvl = level; //store initial value of level
if(curr != NULL){
printLevelNodesHelper(curr->left,level+1);
if(level == lvl){
cout << "Movie: " << curr->title << " " << curr->rating << endl;
}
printLevelNodesHelper(curr->right,level+1);
}
}
void MovieTree::printLevelNodes(int k){ //k is the desired level
MovieNode * curr = root;
if(root == NULL){ //if the tree is empty exit it
return;
}
else if(k == 0){ //print the root's title
cout << "Movie: " << curr->title << " " << curr->rating << endl;
}
else{
printLevelNodesHelper(curr,k);
}
}
这是我的结构和类的信息
struct MovieNode{
int ranking;
string title;
int year;
float rating;
MovieNode* left = NULL;
MovieNode* right = NULL;
};
class MovieTree{
private:
MovieNode* root;
public:
MovieTree();
~MovieTree();
void printMovieInventory();
void addMovieNode(int ranking,std::string title,int year,float rating);
void findMovie(std::string title);
void queryMovies(float rating,int year);
void averagerating();
void printLevelNodes(int k);
};
解决方法
一些问题:
-
由于您对
printLevelNodesHelper
的初始调用获得了所需的级别作为参数,因此使用level+1
进行递归调用没有任何意义。想一想:当您再次出现时,您实际上是在树中下降,使 closer 达到所需的水平,因此您不应该将距离增加到该水平,而应减小它。所以你应该通过level-1
-
在
printLevelNodesHelper
中,if
条件level == lvl
始终为真,因为这些 local 变量都不改变值。从上一点开始,我们保证最终将获得level
等于0的呼叫,我们应该检查level == 0
(因此您不需要lvl
变量)。
代码:
void printLevelNodesHelper(MovieNode * curr,int level) {
if (curr != NULL) {
printLevelNodesHelper(curr->left,level - 1);
if (level == 0) {
cout << "Movie: " << curr->title << " " << curr->rating << endl;
}
printLevelNodesHelper(curr->right,level - 1);
}
}
通过此更改,MovieTree::printLevelNodes
的代码无需处理root == NULL
或k == 0
的边界情况。上面的辅助函数都很好地管理了这两种方法。另一方面,您可能想添加一些保护,以防止如果使用printLevelNodes
的负值调用k
时发生的无限递归:
void MovieTree::printLevelNodes(int k) {
if (k >= 0) printLevelNodesHelper(root,k);
}