【问题标题】:How to print a level of a binary search tree?如何打印二叉搜索树的级别?
【发布时间】:2020-10-17 04:00:11
【问题描述】:

如果我们说,一棵深度为 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);
};

【问题讨论】:

  • 提示:google“级别顺序遍历”
  • 对于printLevelNodes(),有一条注释记录了参数是什么。您能否添加类似的评论来记录printLevelNodesHelper() 的参数?现在,当我查看非递归调用时,我推断出与查看递归调用时不同的目的。不知道你的目的是什么。 (两者都有用。)

标签: c++ data-structures tree binary-search-tree


【解决方案1】:

一些问题:

  • 由于您对printLevelNodesHelper 的初始调用获得了所需的级别作为参数,因此使用level+1 进行递归调用是没有意义的。想一想:当你重复时,你实际上是在树中下降,更接近到所需的水平,所以你不应该增加到那个水平的距离,而是减少它。所以你应该通过level-1

  • printLevelNodesHelper 中,if 条件level == lvl 总是为真,因为这些本地 变量都不会改变值。从上一点开始,我们保证最终我们会收到一个 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 == NULLk == 0 的边界情况。这两个都在上面的辅助函数中得到了很好的管理。另一方面,如果使用负值 k 调用 printLevelNodes,您可能需要添加一些保护来防止无限递归:

void MovieTree::printLevelNodes(int k) {
    if (k >= 0) printLevelNodesHelper(root, k);
}

【讨论】:

  • 非常感谢这条评论真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多