C++ 如何在这种格式下使用递归绘制BST? void printGivenLevel(节点*根,整数级,整数侧,整数x,整数y) { if(root==NULL) 回来 如果(级别==1) { gotoxy(x,y); cout数据; } 否则,如果(级别>1) { if(yleft,1级,1级,x-4级,y级); 打印给定级别(根->右,级别1、2、x+4、y); } 其他的 { 打印给定级别(根->左,级别1,1,x-2,y); 打印给定级别(根->右,级别1、2、x+2、y); } } } 无效打印(节点*根) { int h=高度(根); int i; int-side=0;//左用1,右用2 int x=42;//42是控制台的中心 因为(i=1;i

C++ 如何在这种格式下使用递归绘制BST? void printGivenLevel(节点*根,整数级,整数侧,整数x,整数y) { if(root==NULL) 回来 如果(级别==1) { gotoxy(x,y); cout数据; } 否则,如果(级别>1) { if(yleft,1级,1级,x-4级,y级); 打印给定级别(根->右,级别1、2、x+4、y); } 其他的 { 打印给定级别(根->左,级别1,1,x-2,y); 打印给定级别(根->右,级别1、2、x+2、y); } } } 无效打印(节点*根) { int h=高度(根); int i; int-side=0;//左用1,右用2 int x=42;//42是控制台的中心 因为(i=1;i,c++,recursion,binary-search-tree,C++,Recursion,Binary Search Tree,因为你在写这个答案时没有提供答案,所以我只做了我自己的 从你的问题来看,我认为你的主要问题是如何让递归工作。我在这个答案中提供的代码应该让你了解如何解决这个问题 还有一个缺点:树的每个节点都打印在单独的行上 代码: void printGivenLevel(node *root, int level, int side, int x, int y) { if(root == NULL) return; if(level == 1) { gotoxy(x, y)

因为你在写这个答案时没有提供答案,所以我只做了我自己的

从你的问题来看,我认为你的主要问题是如何让递归工作。我在这个答案中提供的代码应该让你了解如何解决这个问题

还有一个缺点:树的每个节点都打印在单独的行上


代码:

void printGivenLevel(node *root, int level, int side, int x, int y)
{
  if(root == NULL)
   return;

   if(level == 1)
   {
     gotoxy(x, y);
     cout << root->data;
   }
   else if(level > 1)
   {
      if(y<=2)
      {
        printGivenLevel(root->left, level-1, 1, x-4, y);
        printGivenLevel(root->right,level-1, 2, x+4, y);
      }
      else
      {
        printGivenLevel(root->left, level-1, 1, x-2, y);
        printGivenLevel(root->right,level-1, 2, x+2, y);
      }
   }
}
void print(node *root)
 {
   int h = height(root);
   int i;
   int side = 0; // Use 1 for left and 2 for right 
   int x = 42; //42 is the center of console

   for(i=1;i<=h;i++)
   {
     printGivenLevel(root, i, side, x, i);
     cout << endl;
   }

  }
#include <iostream>
#include <memory>
#include <string>

struct Node
{
    Node(Node* l, Node* r, std::string d) : left(l), right(r), data(d) {}
    std::unique_ptr<Node> left;
    std::unique_ptr<Node> right;
    std::string data;
};

void printTree(Node& root, int minx, int maxx)
{
    auto x = ((minx + maxx) / 2);

    auto o = ((x - minx) / 2);
    auto w = std::string(x - o, ' ');
    auto u = std::string(o, '_');
    std::cout << w << u << root.data << u << std::endl;

    if (root.left != nullptr)
        printTree(*(root.left), minx, x);

    if (root.right != nullptr)
        printTree(*(root.right), x, maxx);  
}

int main()
{
    auto lrll = new Node{ nullptr, nullptr, "1" };
    auto lrlr = new Node{ nullptr, nullptr, "2" };
    auto lll = new Node{ nullptr, nullptr, "3" };
    auto llr = new Node{ nullptr, nullptr, "4" };
    auto lrl = new Node{ lrll, lrlr, "5" };
    auto lrr = new Node{ nullptr, nullptr, "6" };
    auto ll = new Node{ lll, llr, "7" };
    auto lr = new Node{ lrl, lrr, "8" };
    auto rl = new Node{ nullptr, nullptr, "9" };
    auto rr = new Node{ nullptr, nullptr, "10" };
    auto l = new Node{ ll, lr, "11" };
    auto r = new Node{ rl, rr, "12" };

    auto root = std::make_unique<Node>(l, r, "13");
    printTree(*root, 0, 84);

    return 0;
}

注意:并非所有下划线都能完美对齐,因为选择了
84
作为初始最大值(我这样做是为了得到位置
42
处的根)

通过根据以下公式正确选择初始最小值和最大值,任何二叉树都可以以最紧凑的方式完美表示:

max-min==2^(h)
h==树的高度

对于代码中使用的树(高度为5),完美的表示需要:

max-min==2^(5)==32

同样地,使用相差32的任何最小值和最大值调用
printTree()
,将生成树的完美和最紧凑的表示

printTree(*根,0,32)

结果如下:

                     _____________________13_____________________
           __________11__________
     _____7_____
   __3__
             __4__
                          _____8_____
                        __5__
                      _1_
                           _2_
                                  __6__
                                                     __________12__________
                                               _____9_____
                                                                    _____10_____

提供编译粘贴在此处的函数所需的所有代码可能会很有用。此外,还可以提供一个
main
函数来构建一个树并打印它。这样,人们就可以立即开始处理你的代码,而不是先编写自己的代码。你不一定能得到答案,但至少会让人们更倾向于这样做d来帮助您。还要注意,
print
函数迭代调用
printGivenLevel
,而函数
printGivenLevel
也递归调用自身。您需要选择其中一个,但不能同时选择两个。如果您想要递归(如问题标题中所述),只需在
print
功能中调用
printGivenLevel
一次即可。欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效帮助您。@MaartenBamelis完全正确;我将更详细地介绍rect:您发布了部分代码,没有规范,也没有实际输出;缺少的部分使您不太可能得到太多帮助。很抱歉,伙计们,我下次会尝试提供更多信息。实际上,我在逻辑方面遇到了更多问题。谢谢您的帮助。我非常感谢。
        ________13________
    ____11____
  __7__
 _3_
     _4_
          __8__
         _5_
         1
           2
             _6_
                    ____12____
                  __9__
                          __10__