微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何打印二进制搜索树的级别?

如何解决如何打印二进制搜索树的级别?

如果我们说的话,是一棵深度为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 == NULLk == 0的边界情况。上面的辅助函数都很好地管理了这两种方法。另一方面,您可能想添加一些保护,以防止如果使用printLevelNodes的负值调用k时发生的无限递归:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。