我正在研究二叉搜索树。 我在输出节点左对齐时遇到问题。我打印数组顺序,预订,订单,后序...数组顺序格式左对齐,就像我希望它... 我基本上使用相同的代码(setw和左;以相同的顺序)作为数组顺序,因为我与preo顺序,其余.. 但是,它不会左对齐..
我已经尝试过一切...... 任何技巧?
正确输出..
Database Of Great Computer Scientists
>>> array order:
name leaf? index
---- ----- -----
Ralston, Anthony 0
Liang, Li 1
Von Neumann, John 2
Jones, Doug 3
Trigoboff, Michael 5
Goble, Colin leaf 7
Knuth, Donald 8
Turing, Alan leaf 12
Kay, Alan leaf 17
(items printed) (9)
>>> preorder:
name leaf? index
---- ----- -----
Ralston, Anthony 0
Liang, Li 1
Jones, Doug 3
Goble, Colin leaf 7
Knuth, Donald 8
Kay, Alan leaf 17
Von Neumann, John 2
Trigoboff, Michael 5
Turing, Alan leaf 12
(items printed) (9)
>>> inorder:
name leaf? index
---- ----- -----
Goble, Colin leaf 7
Jones, Doug 3
Kay, Alan leaf 17
Knuth, Donald 8
Liang, Li 1
Ralston, Anthony 0
Trigoboff, Michael 5
Turing, Alan leaf 12
Von Neumann, John 2
(items printed) (9)
>>> postorder:
name leaf? index
---- ----- -----
Goble, Colin leaf 7
Kay, Alan leaf 17
Knuth, Donald 8
Jones, Doug 3
Liang, Li 1
Turing, Alan leaf 12
Trigoboff, Michael 5
Von Neumann, John 2
Ralston, Anthony 0
(items printed) (9)
>>> retrieve Trigoboff, Michael
Trigoboff, Michael
>>> retrieve Kaye, Danny
not found
这里是有序的代码。其余的功能在设置输出的方式上几乎相同..
void BST::displayInOrder(ostream& out, int parent)const
{
if (parent <= maxsize)
{
this->displayInOrder(out, 2 * parent + 1);
if (!items[parent].empty)
{
out << left
<< setw(27) << items[parent].instanceData;
out << right
<< setw(10);
if(!items[parent].isLeaf)
{
out << left
<< setw(11) << "leaf";
}
out << setw(12) << parent;
out << endl;
}
this->displayInOrder(out, 2 * parent + 2 );
}
if(!parent)
{
itemsPrinted(out,size);
}
}
,这是左对齐的数组顺序代码..
void BST::displayArrayOrder (ostream& out) const
{
out << ">>> array order:" << endl;
displayHeaders(out);
for(int index=0; index < maxsize+1; index++)
{
if (!items[index].empty)
{
out << left
<< setw(27) << items[index].instanceData;
out << right
<< setw(10);
if(index > size)
{
items[index].isLeaf = false;
out << left
<< setw(10) << "leaf";
}
if(items[2*index+1].empty && items[2*index+2].empty && index < size)
{
items[index].isLeaf = false;
out << left
<< setw(11) << "leaf";
}
out << setw(12) << index;
out << endl;
}
}
if(!parent)
{
itemsPrinted(out,size);
}
}
答案 0 :(得分:3)
帮自己一个忙:编写一个函数来显示记录,并在需要的任何地方使用它来显示该类型的记录。由于您已经拥有在一个地方工作的代码,因此只需在print_record()
(或您决定称之为的任何内容)的正文中使用该代码。
你应该尽快学到一件事:重复相同的基本代码三到四次是一个非常坏的事情,你应该避免它。
答案 1 :(得分:1)
在我看到您的代码时,displayArrayOrder
不仅会显示顺序,还会设置isLeaf
属性,然后该属性会直接用于其他显示功能。
正如Jerry Coffin指出的那样,将所有内容分开,并在所有显示功能中使用相同的打印记录功能。
这样的事情应该让你开始。 (显然,当leaf
为假时,您打印isLeaf
,我保留了该约定)
bool BST::hasToPrintLeaf(int index) {
if (!items[index].isLeaf) {
return true
}
if (index > size ||
(index < size && items[2*index+1].empty && items[2*index+2].empty)) {
items[index].isLeaf = false;
return true;
}
}
void BST::printRecord(std::ostream & out, int index) {
out << left << setw(27) << items[index].instanceData;
out << right << setw(10);
if(hasToPrintLeaf(index)) {
out << left << setw(11) << "leaf";
}
out << setw(12) << index << endl;
}
请注意,关于你的逻辑,我并没有真正改变任何东西,而我对某些事情有疑问......(你的两个叶子测试排除了索引==大小为例)