C语言简单直观打印二叉树

最直观的打印二叉树,只能用队列记录二叉树的层次遍历,并记录每个节点的层数及这层里的列数,最后再调整位置打印输出。这样的方法实现起来非常麻烦,所以大多打印二叉树的方法都是采用逆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;	

}

效果图:
在这里插入图片描述

  • 28
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值