最直观的打印二叉树,只能用队列记录二叉树的层次遍历,并记录每个节点的层数及这层里的列数,最后再调整位置打印输出。这样的方法实现起来非常麻烦,所以大多打印二叉树的方法都是采用逆90度输出的方法.
如有二叉树如下:
逆90度的输出:
实现的方法:每个节点都是独立的一行,记录当前是第几层次,根据层数控制输出位置。从最右节点开始输出,再输出根节点,最后输出左节点.
void printTree(node_t *n)
{
static int level = -1; //记录是第几层次
int i;
if (NULL == n)
return;
level++;
printTree(n->right);
level--;
level++;
for (i = 0; i < level; i++)
printf("\t");
printf("%2d\n", n->n);
printTree(n->left);
level--;
}
上面方法已可以显示二叉树,但因没有"/" “\“符号,对左右节点并不好区分.所以代码里再加上符号的处理,这里有两种打印方式。一种是”/” "\"左右节点符号单独作一行,另一种是符号与节点数据作一行.
具体完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
int n;
struct node *left, *right;
}node_t;
void printTree(node_t *n, int type, int level);
void printTree2(node_t *n, int type, int level);
void insertTree(node_t **head, int val);
#define LEN 9
int main(void)
{
node_t *root = NULL;
int i, num[LEN] = {77, 66, 88, 55, 70, 80, 99, 44, 60};
for (i = 0; i < LEN; i++)
insertTree(&root, num[i]);
printTree(root, 0, 0);
printf("\n##################\n");
printTree2(root, 0, 0);
return 0;
}
// 打印二叉树: type : 0表示根节点,1表示左节点,2表示右节点. level表示层次,用于控制显示的距离
void printTree(node_t *n, int type, int level)
{
int i;
if (NULL == n)
return;
printTree(n->right, 2, level+1);
switch (type)
{
case 0:
printf("%2d\n", n->n);
break;
case 1:
for (i = 0; i < level; i++)
printf("\t");
printf("\\\n");
for (i = 0; i < level; i++)
printf("\t");
printf(" %2d\n", n->n);
break;
case 2:
for (i = 0; i < level; i++)
printf("\t");
printf(" %2d\n", n->n);
for (i = 0; i < level; i++)
printf("\t");
printf("/\n");
break;
}
printTree(n->left, 1, level+1);
}
// 打印二叉树: type : 0表示根节点,1表示左节点,2表示右节点. level表示层次,用于控制显示的距离
void printTree2(node_t *n, int type, int level)
{
int i;
if (NULL == n)
return;
printTree2(n->right, 2, level+1);
switch (type)
{
case 0:
printf("%2d\n", n->n);
break;
case 1:
for (i = 0; i < level; i++)
printf("\t");
printf("\\ %2d\n", n->n);
break;
case 2:
for (i = 0; i < level; i++)
printf("\t");
printf("/ %2d\n", n->n);
break;
}
printTree2(n->left, 1, level+1);
}
void insertTree(node_t **head, int val)
{
node_t *new = malloc(sizeof(*new)), *tmp;
new->left = new->right = NULL;
new->n = val;
if (NULL == *head)
{
*head = new;
return;
}
tmp = *head;
while (1)
{
while ((tmp->right != NULL) && (new->n > tmp->n))
tmp = tmp->right;
if ((new->n > tmp->n) && (tmp->right == NULL))
break;
while ((tmp->left != NULL) && (new->n <= tmp->n))
tmp = tmp->left;
if ((new->n <= tmp->n) && (tmp->left == NULL))
break;
}
if (new->n > tmp->n)
tmp->right = new;
else
tmp->left = new;
}
效果图: