<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Shaw 的树洞</title><description>学习笔记 / 折腾记录 / 随手写</description><link>https://me.622168.xyz/</link><language>zh_CN</language><item><title>FreeRTOS 任务基础</title><link>https://me.622168.xyz/posts/freertos/freertos-task-basics/</link><guid isPermaLink="true">https://me.622168.xyz/posts/freertos/freertos-task-basics/</guid><description>任务的创建、优先级和不能返回这件事</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;任务是什么&lt;/h2&gt;
&lt;p&gt;FreeRTOS 里的任务就是一个死循环函数，调度器让它们轮流占用 CPU。&lt;/p&gt;
&lt;h2&gt;创建一个任务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;xTaskCreate(vTaskCode, &quot;NAME&quot;, STACK_DEPTH, NULL, tskIDLE_PRIORITY + 1, NULL);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数依次是函数、名字、栈深度、传入参数、优先级、任务句柄。&lt;/p&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;p&gt;任务函数不能返回。要结束就调用 &lt;code&gt;vTaskDelete(NULL)&lt;/code&gt;。&lt;/p&gt;
</content:encoded></item><item><title>完全二叉树</title><link>https://me.622168.xyz/posts/data-structure/complete-binary-tree/</link><guid isPermaLink="true">https://me.622168.xyz/posts/data-structure/complete-binary-tree/</guid><description>完全二叉树的定义、性质，以及为什么它适合用数组存储。</description><pubDate>Sun, 06 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一句话定义&lt;/h2&gt;
&lt;p&gt;除最后一层外，每一层都被节点填满；最后一层的节点全部靠左连续排列。这样的二叉树叫完全二叉树。&lt;/p&gt;
&lt;p&gt;关键在&quot;靠左连续&quot;这四个字。最后一层可以不满，但中间不能空出位置。&lt;/p&gt;
&lt;h2&gt;和满二叉树的区别&lt;/h2&gt;
&lt;p&gt;满二叉树是每一层都填满，节点数刚好是 &lt;code&gt;2^h - 1&lt;/code&gt;。满二叉树一定是完全二叉树，反过来不成立。&lt;/p&gt;
&lt;h2&gt;几条常用性质&lt;/h2&gt;
&lt;p&gt;设节点总数为 &lt;code&gt;n&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高度是 &lt;code&gt;floor(log2(n)) + 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;叶子节点从下标 &lt;code&gt;floor(n/2) + 1&lt;/code&gt; 开始（下标从 1 算起）&lt;/li&gt;
&lt;li&gt;只有最后一个非叶子节点可能只有左孩子，没有右孩子&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;为什么能用数组存&lt;/h2&gt;
&lt;p&gt;因为节点位置连续，不会出现空洞，所以下标可以直接算出父子关系。下标从 1 开始时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 节点 i 的左孩子、右孩子、父节点
left   = 2 * i;
right  = 2 * i + 1;
parent = i / 2;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下标从 0 开始时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;left   = 2 * i + 1;
right  = 2 * i + 2;
parent = (i - 1) / 2;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不用存指针，省空间，访问也快。堆（优先队列）就是靠这个性质实现的。&lt;/p&gt;
&lt;h2&gt;判断是不是完全二叉树&lt;/h2&gt;
&lt;p&gt;层序遍历，遇到空节点就停止往队列里加，然后检查队列里剩下的是否全为空。如果后面还出现了非空节点，说明中间有空洞，不是完全二叉树。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bool isComplete(Node *root) {
    if (!root) return true;

    Node *queue[MAXN];
    int head = 0, tail = 0;
    queue[tail++] = root;
    bool metNull = false;

    while (head &amp;lt; tail) {
        Node *cur = queue[head++];
        if (cur == NULL) {
            metNull = true;      // 记录已经遇到过空位
        } else {
            if (metNull) return false;   // 空位后面又出现节点，有空洞
            queue[tail++] = cur-&amp;gt;left;
            queue[tail++] = cur-&amp;gt;right;
        }
    }
    return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;容易踩的点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;最后一层节点数可以是 1 到 &lt;code&gt;2^(h-1)&lt;/code&gt; 之间任意值，但必须从左往右连着放&lt;/li&gt;
&lt;li&gt;&quot;只缺右孩子&quot;是允许的，&quot;只缺左孩子&quot;不允许&lt;/li&gt;
&lt;li&gt;数组存储只对完全二叉树划算，普通二叉树用数组会浪费很多空位&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>怎么用这个笔记本</title><link>https://me.622168.xyz/posts/notes/how-to-use/</link><guid isPermaLink="true">https://me.622168.xyz/posts/notes/how-to-use/</guid><description>记录一下我自己怎么往这个网站里加笔记，忘了就回来看这篇。</description><pubDate>Sun, 06 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;加一篇新笔记&lt;/h2&gt;
&lt;p&gt;在项目目录里执行，&lt;code&gt;xxx&lt;/code&gt; 换成文件名（用英文，别带空格）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm new-post 数据结构/二叉树
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它会在 &lt;code&gt;src/content/posts/&lt;/code&gt; 下生成一个 &lt;code&gt;.md&lt;/code&gt; 文件，开头那一段是文章信息，下面直接写正文。&lt;/p&gt;
&lt;h2&gt;开头那一段怎么填&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: 完全二叉树          # 标题，写中文没问题
published: 2026-09-06     # 日期
description: 一句话说明   # 列表页会显示这句
tags: [&quot;数据结构&quot;]        # 标签，可以多个
category: 数据结构        # 分类，只能一个
draft: false              # 改成 true 就是草稿，网站上看不见
---
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;正文只要记住这几个&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;## 二级标题
### 三级标题

**加粗**

- 列表项
- 列表项

1. 有序列表
2. 有序列表

`行内代码`

[链接文字](https://example.com)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码块用三个反引号包住，后面写语言名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int main(void) {
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;本地看效果&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后浏览器打开终端里给出的地址，改完文件保存，页面会自动刷新。&lt;/p&gt;
&lt;h2&gt;发布出去&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &quot;新增笔记&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推上去之后 Cloudflare Pages 会自动重新构建，一两分钟后网站就更新了。&lt;/p&gt;
</content:encoded></item></channel></rss>