我一直在学习如何使用C ++中的链接列表编写二叉树搜索。一切正常,我理解二进制树是如何工作的,但是我希望能够打印出头部顶部的树,以及下面的所有节点,我试图在这里展示:
[root or head]
[left] [right]
[left] [right] [left] [right]
我使用控制台打印树,因此可以随意使用'cout'或'printf'。我相信我需要设置控制台的宽度,但我不知道如何开始。
谢谢,Y_Y
答案 0 :(得分:6)
正如sbi所提到的,制作左对齐版本比中心对齐版本更容易。但无论你选择哪种对齐,你的基本算法都应该是:
首先遍历树的广度。通过使用具有以下算法的队列来执行此操作:
(见http://www.cs.bu.edu/teaching/c/tree/breadth-first/)
为了打印中心对齐的树,也要执行以下操作(仅在树完成时才有效。如果它不完整,最简单的方法是在每个应该有节点的地方进行完整复制某种空节点):
答案 1 :(得分:3)
这是打印二叉树的代码 - 下面的代码从左到右打印二进制树
private void printTree(Node nNode,int pos){
if (nNode==null) {
for(int i=0;i<pos;i++) System.out.print("\t");
System.out.println("*");
return;
}
printTree(nNode.right,pos+1);
for(int i=0;i<pos;i++) System.out.print("\t");
System.out.println(nNode.data);
printTree(nNode.left,pos+1);
}
以上是上述方法的输出
上面输出中的
'*'表示空
答案 2 :(得分:1)
@ IsAs的解决方案。 90度CCW在C ++中旋转树。我建议这个用在不超过2 ^ 4的树上。
print(root);
void BinarySearchTree::print(BinaryNode* n, int pos = 0){
if (n==NULL) {
for(int i = 0; i < pos; ++i)
cout << "\t";
cout << 'X' << endl;
return;
}
print(n->right,pos+1);
for(int i = 0; i < pos; i++)
cout << "\t";
cout << n->key << endl;
print(n->left,pos+1);
}