1. 程式人生 > >[二叉樹] 6.69 按樹形狀列印二叉樹

[二叉樹] 6.69 按樹形狀列印二叉樹

題目來源:嚴蔚敏《資料結構》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; }