[二叉樹] 6.69 按樹形狀列印二叉樹
阿新 • • 發佈:2018-12-13
題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.69
【題目】6.69 假設以二叉連結串列儲存的二叉樹中,每個結點所含資料元素均為單字母,試編寫演算法,按樹形狀列印二叉樹的演算法。例如:左下二叉樹印為右下形狀。
【思路】
- 觀察例子–>列印的順序為:CFEADB
- 順序肯定與遞迴順序有關–>寫出三種遞迴序列 - 先序:ABDCEF - 中序:FCEADB–>逆序即是列印的順序
- 前面的空格–>與層數有關–>層數為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;
}