Skip to content

NeptuneZhao/Experiment-SZJG

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Experiment-SZJG

写给所有人...

持续更新中...

readme 只是题目. 程序不是最终版本, 请以代码为准.

如果您觉得该仓库对您有用, 请添加个 Star 吧!

代码中没有出现过非 C 语言标准库的函数 (比如 atoi), 请放心跨平台吧! (!Windows)

写给同学们...

这些内容的更改状态不完全在 comments 中显示, 很多都是我改完直接点击保存的.

所有内容均已通过 OJ 验证, 请放心食用.

我在俩平台上边编译的, VS Code 要求 Markdown 比较严格, CLion 要求代码比较严格

所以 readme 有两种格式, 代码也有两种风格.

但是! 对我来说

public staic void Main(String[] args) {
    system.out.println("Hello World!");
}

这种大括号打在后侧的简直就是异端邪教...完全无法接受

还有这种

for (int i = 0; i < 2147483647; i++)
    if (3 + 5 >= 8 && 4 + 6 >= 10) printf("Oh yeah.\n");

把所有语句挤到一行里边的, 我之前看着很不顺眼, 但是最近竟然习惯了 qwq

一定要注意格式!!!

写给老师和助教们...

readme 只是题目. 程序不是最终版本, 请以代码为准.

为了确保程序通过 OJ 验证, 我将代码作为最终维护版本, 一方面节省了

system("pause");

带来的 OJ 验证开销, 另一方面便于 Github 代码的维护.

请在验收时使用 IDE 的调试控制台, 以免造成打开程序没有看到结果, 程序就退出了的后果.

总结经验...

readme 只是题目. 程序不是最终版本, 请以代码为准.

  1. 1001

就是个啥必题, 不用管

啥必才会这样写

  1. 1002

栈的思想还是挺不错的, 实现起来也挺有意思

不过就是太烦人了, 但只需要记住压栈和出栈就好了

Stack is a LIFO structure.

  1. 1003

最看不上老师的一集

队列本来是一个独立的结构, 非得用栈来表示?

Queue is a FIFO structure.

It can be easily demonstrated as a node.

  1. 2001

普及一下, 什么叫做二叉树: 一个节点最多有两个孩子

Binary Tree, 当只有最下两行有 $n_0$$n_1$ 且最后一行节点都在左下角满排列时, 称为完全二叉树(Complete BiTree)

当节点个数为 $n^2 - 1$ 时, 称为满二叉树(Full BiTree)

你管他要不要求有无父域, 你自己在 node 中加一个不就好了

typedef struct BinaryTreeNode
{
   int index;
   struct BinaryTreeNode *lchild, *rchild, *parent;
} BiTree;

加入父域的好处是, 遍历时可以直接判断是不是左叶, 如 2003

下面讨论 BiTree 的 pre/in/post-OrderTraverse

  • 前序遍历 preOrderTraverse

是一种 PLR 结构, 也就是: 从 node -> root 开始, 先 print, 再 pOT(left), 最后 pOT(right)

注意: 每个节点都需要 PLR, 也就是说, root -> lchild 和 root -> rchild 的遍历操作和 root 一样

前序遍历还是很简单的, 就咔咔从 root 开始, 从左往右写就行

  • 中序遍历 inOrderTraverse

是一种 LPR 结构, 也就是: 先访问左子, 左子没了打印自己, 然后访问右子

中序遍历在树图上表现为: 水平方向从左往右顺序遍历

  • 后序遍历 postOrderTraverse

C 语言是一个很奇怪的语言, 它会在很奇怪的位置加下划线, 并且总会在你预想不到的位置上区分大小写, 比如: __cdecl, _INC_STDIO

C++ 是一个相对来说不怎么奇怪的语言, 毕竟我是 C# 出身, 对面向对象的语言有些许了解, 但是令我不解的是: 头文件没有文件后缀......

直至现在我也不清楚为什么前辈们发明了后序遍历这种遍历方式

  1. 2002

镜像化二叉树, 只需要 swap() 的思想, 再加个递归就完事了

树这种东西, 不加递归就是耍流氓, 如果你不知道为什么或者是在哪加, 只需要在操作的地方加上递归就完事了

不信看代码, 本题真的很简单

  1. 2003

这是一个全局变量大显身手的环节, 虽然我知道, 全局变量很危险

但是当我拿出来

public class Program
{
    public static int GlobalSummary = 2147483647;
    public static void Main(string[] args)
    {
        GlobalSummary -= 2147483647;
    }
}

时, 阁下该如何应对?

简单的程序并不需要复杂的领域认证, 全推 public 就好啦~

言归正传, 这道题就是判断谁是左叶, 就像我在 2001 说的那样, 在二叉树结构体加一个 parent

或者, 在传参时, 加一个 parent 参数

typedef struct BinaryTreeNode { } BiTree;
int GlobalSummary = 0;
void preOrderTraverse(BiTree* node, BiTree* parent)
{
    if (node == NULL)
        return;
    GlobalSummary += IsLeftLeave(node, parent);
    
    preOrderTraverse(node -> lchild, node);
    preOrderTraverse(node -> rchild, node);
}

我没回去看, 到底是用的传参还是结构体的 parent, 总之

加一个父域会让你的代码变得高效, 而且有助于 2004 的解答

  1. 2004

为了做这道题, 特地学习了一下 DFS (深度优先搜索)

自己看代码吧, 我都绷不住了, 这写得太神秘了

  1. 3001

不想写了... 自己 AI 吧.

(虽然是说持续更新中)

Releases

No releases published

Packages

No packages published

Languages