由于学习树这一章节,查阅了很多资料,网上书上代码上,自己的别人的已然分不开了,如有侵权请留言,如同意我记录于此,也请留言区留下大名,必然感谢!
大致了解了二叉树,那么总是那样 各种顺序的输出,我看着不舒服,也不直观,于是在网上找到了如下方法,我感觉是半可视化打印树,黑窗口下看到这样的效果我仍然激动的想流泪啊:
算法:
从上至下,打印右子树,根节点,左子树
·函数outputTree(BinaryNode * t, bool left, const string s, ostream & out = cout)
·通过第二个 bool 参数判断当前的打印左,右,上面的左子树 和下面的右子树 需要最左边与根相连
·空白和-----数量相等,空白是格式,-----相当于延长链接线并匹配空白
代码:
public:
void printTree(ostream & out = cout) const { printTree(root, out); }
private:
//上面root->right的left 和 下面root->left的right 需要 | 链接
void outputTree(BinaryNode * t, bool left, const string s, ostream & out = cout) const {
if (t->right)
outputTree(t->right, false, s + (left ? "| " : " "), out);
out << s;
out << (left ? '\\' : '/');//左连 和右连 的 链接线方向
out << "-----";
out << t->element << endl;
if (t->left)
outputTree(t->left, true, s + (left ? " " : "| "), out);
}
void printTree(BinaryNode * t, ostream & out = cout) const {
if (t == nullptr) return;
if (t->right)
outputTree(t->right, false, "", out);
out << t->element << endl;
if (t->left)
outputTree(t->left, true, "", out);
}
效果图:
我用的是而二叉查找树和AVL树各来一张:
注意问题
·如果相关的 private:printTree() 不加const 会出现2 个重载没有this指针的合法转换
·多看几遍,多理解,多思考,下次自己写出来更好的