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__