re题(46)BUUCTF-[WUSTCTF2020]level4
BUUCTF在线评测
ida打开找main函数,看到提示词data strycture知道是数据结构,查看init,type1,type2函数
init函数是一种数据结构的赋值操作
type1是二叉树中序遍历输出
type2是二叉树后序遍历输出
因为是elf文件,把文件放到虚拟机里运行一下,我们知道了中序和后序遍历的结果,就是让我们用前序遍历输出
用c++写一下脚本
#include <iostream>
//知道后序和中序遍历结果,用前序遍历输出
using namespace std;
char post[] = "20f0Th{2tsIS_icArE}e7__w"; // 后序遍历结果,字符串中每个字符都有下标
char mid[] = "2f0t02T{hcsiI_SwA__r7Ee}"; // 中序遍历结果,字符串中每个字符都有下标
void pre(int root, int start, int end)
// root指的是后序遍历中根在字符串中的下标,因为后序遍历顺序是左右根,所以最后的根
//是二叉树最顶上的那个字符,也就是前序遍历的第一个字符(自己画一下就明白了)
//start指的是中序遍历中要处理的树所包含字符串开始的下标,因为中序遍历顺序是左根右
//关键是理解我们看一棵树的时候,要知道根只是一个字符,左子树是根左边所有相连的字符
//构成左子树,右子树同样道理,所以说如果以最顶上的字符为根,那么这棵树就包含了所有
//的字符,再举个例子,如果以最顶上字符左边相连的第一个字符为根,那么这棵树包含的
//字符就是 以最顶上字符为根的树 的左子树 包含的字符
//end指的是中序遍历中要处理的树所包含字符串结束的下标
{
if (start > end)
return;
//因为中序是左根右,所以要处理的字符数量最少为1,否则返回空,即开始位置要小于等于结束位置
int i = start;//把中序遍历要处理树的开始字符的下标赋给i
while (i < end && mid[i] != post[root]) i++; //用i定位要处理树的根在中序的位置
cout << mid[i]; //输出当前处理的树的根
pre(root - 1 - (end - i), start, i - 1); //递归把当前树的左子树作为新树再处理
pre(root - 1, i + 1, end); //递归把当前树的右子树作为新树再处理
}
int main()
{
pre(24, 0, 24);
return 0;
}
// wctf2020{This_IS_A_7reE}
帮助理解二叉树:
C语言实现二叉树的遍历(数据结构)_二叉树遍历c语言-CSDN博客
二叉树遍历:已知前序中序输出后序/已知后序中序输出前序_知道前序和中序-CSDN博客