头歌打印二叉树(递归里自增自减陷阱)

简介: 头歌打印二叉树(递归里自增自减陷阱)

任务描述


本关任务:请你实现 PrintTree.cpp 里的void PrintTreeRootLeft(TNode* r, int layer)函数。


相关知识


用二叉树的双指针结构存储二叉树,每个结点所含数据元素均为单个字母,试编程实现按树形状打印二叉树的算法。例如:图 1 的二叉树打印为右边的形状。


图 1 打印树结构示意图


ae683eba2b2a4905bbd426e7f48422f0.png


图 1 中的二叉树打印出来的树结构实际上是一个6行4列的矩阵,如图 2 所示。

图 2 树结构打印矩阵




b6e4e5b1d6f04b34a3fd332747248224.png

若由下往上收集结点,得到的序列刚好是该树的中序遍历序列,因此打印树结构相当于按照中序遍历序列的相反次序进行打印,每个结点打印一行;该例子中,打印出来的树结点共 4 列,与树的层数相同,每个结点在打印结果中所在的列号等于该结点在树中的层号。


为了便于看清打印结果,我们要求对于打印出的每一行,字母前的每个空格打印为“-----”,即连续5个’-‘;字母打印为形如”----A”的形式;字母后的空格不用打印。这样图 1 的树的打印结果应为:

---------C
-------------------F
--------------E
----A
--------------D
---------B


树结点结构定义为:


struct TNode{
char data;
struct TNode* left;
struct TNode* right;
};


编程要求

请你实现 PrintTree.cpp 里的void PrintTreeRootLeft(TNode* r, int layer)函数。

//PrintTree.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "PrintTree.h"
TNode* LayersToTree(char *A, int n)
/*
功能:由补充虚结点(‘^’)的层序序列构造二叉树
参数:`A`: 补充了虚结点(‘^’)的层序序列
`n`: 序列的长度
输出: 所构造的二叉树的根指针,`NULL`表示没有构造出二叉树
*/
{
TNode** pnode;
TNode* node;
int i;
if(n<=0)
return NULL;
pnode= new TNode*[n];
for(i=0; i<n; i++){
if(A[i]!='^'){
node=new TNode;
node->data=A[i];
node->left=NULL;
node->right=NULL;
pnode[i]=node;
}
else
pnode[i]=NULL;
}
for(i=0; i<n; i++){
if(pnode[i]==NULL) continue;
if(2*(i+1)<=n && pnode[2*(i+1)-1]!=NULL)
pnode[i]->left=pnode[2*(i+1)-1];
if(2*(i+1)+1<=n && pnode[2*(i+1)]!=NULL)
pnode[i]->right=pnode[2*(i+1)];
}
node=pnode[0];
delete pnode;
return node;
}
void PrintTreeRootLeft(TNode* r, int layer)
//r是树中一棵子树的根,打印以结点r为根的子树,
//layer是r在树中所处的层,约定树的根结点的层号为1
{
//在begin和end之间实现你的代码。
/******begin********/
/******end**********/
}
void DeleteTree(TNode* t)
{
if(t==NULL) return;
if(t->left) DeleteTree(t->left);
if(t->right) DeleteTree(t->right);
delete t;
}
————————————————
版权声明:本文为CSDN博主「忧伤小A」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_63499305/article/details/127587866


测试说明


本关的测试过程如下:


平台编译 step2/Main.cpp ;

平台运行该可执行文件,并以标准输入方式提供测试输入;

平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。

输入格式: 输入层序序列


输出格式: 输出打印结果


以下是平台对 step2/Main.cpp 的测试样例:


样例输入: ABD^C^E


样例输出: Print (Root Left): --------------E ---------D ----A --------------C ---------B


开始你的任务吧,祝你成功!


代码

很基础的题目,中序遍历反向即可。


void PrintTreeRootLeft(TNode* r, int layer)
//r是树中一棵子树的根,打印以结点r为根的子树,
//layer是r在树中所处的层,约定树的根结点的层号为1
{
    /*请在BEGIN和END之间实现你的代码*/
    /*****BEGIN*****/
    int i,j;
    if(r==NULL){
        return;
    }


    PrintTreeRootLeft(r->right,layer+1);//注意递归里千万不要用自增自减运算符,自增自减改变的是这个变量的值,而递归里面的增加则是将layer+1的值赋给下一个layer,对当前时空的layer是没有影响的。

for(i=0;i<5*(layer-1);i++){
        printf("-");
    }
    printf("----%c\n",r->data);
    PrintTreeRootLeft(r->left,layer+1);
    /******END******/
    /*请不要修改[BEGIN,END]区域外的代码*/
}



相关文章
|
5月前
|
C语言
C语言学习记录——用递归思想求第n个斐波那契数,函数递归
C语言学习记录——用递归思想求第n个斐波那契数,函数递归
27 0
|
6月前
|
C语言
【C语言必刷题】4. 打印100~200之间的素数
【C语言必刷题】4. 打印100~200之间的素数
|
6月前
|
C语言 数据安全/隐私保护
【C语言】分支和循环的应用(二分查找、字符移动、模拟登录界面)
【C语言】分支和循环的应用(二分查找、字符移动、模拟登录界面)
45 0
|
6月前
|
C语言
【C语言必刷题】1.打印1~100之间的奇数
【C语言必刷题】1.打印1~100之间的奇数
|
6月前
|
C语言
C语言第十四弹---函数递归
C语言第十四弹---函数递归
|
6月前
|
算法 C语言
C语言汉诺塔数列(循环版,递归版)
C语言汉诺塔数列(循环版,递归版)
70 0
|
6月前
|
C语言
C语言第四十六弹---最快方法找到杨氏矩阵中的数下标
C语言第四十六弹---最快方法找到杨氏矩阵中的数下标
|
6月前
|
自然语言处理 算法 编译器
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
157 0
|
算法 C语言
【八皇后问题】暴力破解------C语言循环
【八皇后问题】暴力破解------C语言循环
94 0
|
算法 vr&ar 网络架构
汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】
汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】
94 0