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

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

任务描述


本关任务:请你实现 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]区域外的代码*/
}



相关文章
|
存储 C语言
数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)
数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)
数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
886 16
|
监控 调度
队列的深度解析:链式队列的实现
队列的深度解析:链式队列的实现
|
存储 算法
数据结构— —栈的基本操作(顺序栈和链栈)
数据结构— —栈的基本操作(顺序栈和链栈)
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
595 12
|
机器学习/深度学习 算法 数据挖掘
数据分析案例-基于PCA主成分分析法对葡萄酒数据进行分析
数据分析案例-基于PCA主成分分析法对葡萄酒数据进行分析
1204 0
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
771 3
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
935 0
|
安全 算法 Java
我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密
前言 未加密的抓包截图 加密之后的抓包截图 基本需求及概念 AES算法 AES基本原理及算法流程 AES算法流程 RSA算法 RSA算法基本原理及流程 RSA算法实现流程 AES与RSA相结合数据加密方案 Android端 AESRSA结合实践 基本要求 基本流程 Android端 服务器端 java版示例 更多参考 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息。
2455 0

热门文章

最新文章