直观的打印一颗二叉树
在节点值两边加上特定的字符串标记来区分孩子和位置以及之间的位置关系:
HXH:表示头结点 X;vYv:表示节点 Y 是左下方最近节点的孩子;Z:表示节点 Z 是左上方最近节点的孩子
遍历树的顺序为:右子树 -> 根 -> 左子树;
避免节点值长度不同影响对其,规定每个节点值长度为固定值(这里规定为 10)
- 最直观的打印二叉树
public class PrintBinaryTree {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
value = data;
}
}
public static void printTree(Node head) {
System.out.println("Binary Tree:");
printInOrder(head, 0, "H", 10);
System.out.println();
}
/**
* @param head :传入的节点
* @param treeHeight:层数(根节点为 0)
* @param to :表示的特定节点 H表示根节点 ^表示父亲节点在左上方 v表示父亲节点在左下方
* @param totalLength :指定每一个节点打印的宽度(总宽度)
*/
public static void printInOrder(Node head, int treeHeight, String to, int totalLength) {
if (head == null) {
return;
}
// 递归遍历右子树
printInOrder(head.right, treeHeight + 1, "v", totalLength);
// 在节点值两边加上标识符
String val = to + head.value + to;
int valueLength = val.length();
// 节点值左边的空格数:(总长度 - 节点值长度)/ 2
int leftSpaceLength = (totalLength - valueLength) / 2;
// 节点值右边的空格数
int rightSpaceLength = totalLength - valueLength - leftSpaceLength;
val = getSpace(leftSpaceLength) + val + getSpace(rightSpaceLength);
// treeHeight * totalLength 为打印的节点前空格长度
System.out.println(getSpace(treeHeight * totalLength) + val);
// 递归遍历左子树
printInOrder(head.left, treeHeight + 1, "^", totalLength);
}
public static String getSpace(int num) {
String space = " ";
StringBuffer buf = new StringBuffer("");
for (int i = 0; i < num; i++) {
buf.append(space);
}
return buf.toString();
}
public static void main(String[] args) {
Node head = new Node(1);
head.left = new Node(-22);
head.right = new Node(3);
head.left.left = new Node(2);
head.right.left = new Node(55);
head.right.right = new Node(66);
head.left.left.right = new Node(7);
printTree(head);
head = new Node(1);
head.left = new Node(1);
head.right = new Node(1);
head.left.left = new Node(1);
head.right.left = new Node(1);
head.right.right = new Node(1);
head.left.left.right = new Node(1);
printTree(head);
}
}
程序运行结果
Binary Tree:
v66v
v3v
^55^
H1H
^-22^
v7v
^2^
Binary Tree:
v1v
v1v
^1^
H1H
^1^
v1v
^1^
注释:打印结果中, HXH表示头结点 X,VYV表示 Y 是左下方最近结点的孩子;Z 表示 Z 是左上方最近结点的孩子;
C++代码
#include<string>
#include <stdio.h>
#include<iostream>
using namespace std;
class Node
{
public:
int value;
Node* left;
Node* right;
Node(int data)
{
value = data;
}
};
void printInOrder(Node* head, int treeHeight, string to, int totallength);
string getspace(int num);
void printtree(Node * head)
{
printf("binnary tree\n");
printInOrder(head, 0, "H", 10);
}
void printInOrder(Node* head, int treeHeight, string to, int totallength)
{
if (head == NULL) { return; }
printInOrder(head->right, treeHeight + 1, "V", totallength);
string val = to + to_string(head->value) + to;
int valueLength = val.length();
int leftspaceLength = (totallength - valueLength) / 2;
int rightspaceLength = totallength - valueLength - leftspaceLength;
val = getspace(leftspaceLength) + val + getspace(rightspaceLength);
cout<<getspace(treeHeight*totallength) + val+"\n";
printInOrder(head->left, treeHeight + 1, "A", totallength);
}
string getspace(int num)
{
string space = " ";
string buf = "";
for (int i = 0; i < num; i++)
buf += space;
return buf;
}
int main()
{
Node* head = new Node(1);
head->left = new Node(-22);
head->right = new Node(3);
head->left->left = new Node(2);
head->right->left = new Node(55);
head->right->right = new Node(66);
head->left->left->right = new Node(7);
printtree(head);
delete(head->left->left->right);
delete(head->right->right);
delete(head->right->left);
delete(head->left->left);
delete(head->right); delete(head->left); delete(head);
int a;
cin >> a;
return 0;
}