[二叉树] 6.69 按树形状打印二叉树

版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/82938306

题目来源:严蔚敏《数据结构》C语言版本习题册 6.69

【题目】6.69
假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母,试编写算法,按树形状打印二叉树的算法。例如:左下二叉树印为右下形状。

在这里插入图片描述

【思路】

  1. 观察例子–>打印的顺序为:CFEADB
  2. 顺序肯定与递归顺序有关–>写出三种递归序列
    - 先序:ABDCEF
    - 中序:FCEADB–>逆序即是打印的顺序
  3. 前面的空格–>与层数有关–>层数为i–>空格就有i-1个

【答案】

void PrintAsTree(BiTree T, int i) { //i代表所在层次
	int j;
	if (T) {
		PrintAsTree(T->rchild, i+1); //访问右子树

		for (j=0; j<i-1; ++j) printf(" ");
		printf("%c\n",	T->data);

		PrintAsTree(T->lchild, i+1); //访问左子树
	}
}

【完整代码】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#ifndef BASE
#define BASE
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int bool;
#endif

#define TElemType char //固定为char,若修改需要修改方法
typedef struct BiTNode { // 结点结构
    TElemType      data;
    struct BiTNode  *lchild, *rchild; // 左右孩子指针
}BiTNode, *BiTree;
void visit(TElemType e) {
	printf("%c", e);
}


Status PreCreate(BiTree *pT); // 先序遍历创建二叉树

// 6.69 按树状打印
/* 思考:
	1. 观察例子-->打印的顺序为:CFEADB
	2. 顺序肯定与递归顺序有关-->写出三种递归序列
		- 先序:ABDCEF
		- 中序:FCEADB-->逆序即是打印的顺序
	3. 前面的空格-->与层数有关-->层数为i-->空格就有i-1个
*/
void PrintAsTree(BiTree T, int i) { //i代表所在层次
	int j;
	if (T) {
		PrintAsTree(T->rchild, i+1); //访问右子树

		for (j=0; j<i-1; ++j) printf(" ");
		printf("%c\n",	T->data);

		PrintAsTree(T->lchild, i+1); //访问左子树
	}
}

int main() {
/* 6.69
AB#D##CE#F###
*/

	BiTree T;

	PreCreate(&T);

	PrintAsTree(T, 1);
	return 0;
}

// 先序遍历创建二叉树
Status PreCreate(BiTree *pT) {
	char ch;
	scanf("%c", &ch);
	if ('#' == ch ) *pT=NULL;
	else {
		*pT = (BiTNode *)malloc(sizeof(BiTNode));
		if (!*pT) exit(OVERFLOW);
		(*pT)->data = ch;
		PreCreate( &(*pT)->lchild );
		PreCreate( &(*pT)->rchild );
	}
	return OK;
}

猜你喜欢

转载自blog.csdn.net/summer_dew/article/details/82938306