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

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

任务描述


本关任务:请你实现 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语言的阶乘和斐波那契数列递归实现。递归需满足:问题可转化为规模更小的同类问题,存在结束条件以防止无限循环,并可能消耗大量时间和栈空间。栈用于存储函数调用信息,过多递归可能导致栈溢出。递归虽简洁,但非最优效率选择,递推算法通常是更好的替代方案。
|
6月前
|
C语言
C语言学习记录——用递归思想求第n个斐波那契数,函数递归
C语言学习记录——用递归思想求第n个斐波那契数,函数递归
41 0
|
6月前
|
C语言
C语言函数递归详解:理解递归的原理与应用
C语言函数递归详解:理解递归的原理与应用
137 0
|
7月前
|
算法 C语言
C语言汉诺塔数列(循环版,递归版)
C语言汉诺塔数列(循环版,递归版)
89 0
|
C语言
【C语言】用函数递归的方法解决汉诺塔问题
【C语言】用函数递归的方法解决汉诺塔问题
85 0
二叉树遍历——递归链式(C语言实现)(上)
二叉树遍历——递归链式(C语言实现)
二叉树遍历——递归链式(C语言实现)(下)
二叉树遍历——递归链式(C语言实现)
【C语言】函数和递归的基础题目
【C语言】函数和递归的基础题目
|
C语言
汉诺塔问题C语言递归(详细)
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?(每次只能移动1个盘子,大盘子只能放在小盘子下面)
312 0
|
算法 C语言 计算机视觉
一篇帮你搞定C语言“套娃”(递归)
一篇帮你搞定C语言“套娃”(递归)