1 条题解

  • 0
    @ 2026-10-27 13:20:34

    思路与算法

    先统计每个孩子行号的入度,找到没有父亲的根。递归中序访问:先左子树,再把访问计数加1、比较当前值,最后右子树。第一次值等于x时记录计数,此后不覆盖;遍历完仍无记录则输出0。

    正确性说明

    有根二叉树唯一根入度0,其余各有一个父亲。中序递归定义直接保证访问计数依次等于各点在中序序列的位置。首次相等时保存的正是要求的最小访问序号,重复值不会覆盖;不存在时初值0保持。

    复杂度

    读入、找根与遍历均O(n),初始化O(n);空间O(n),包含孩子数组与最坏链状树的递归栈。

    易错点

    原样例值15在存储第5行,但中序第4次访问,答案是4。不能直接返回行号,也不能把普通二叉树当作按值有序的BST。根不一定为1,值也可重复。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int n;
        long long x;
        cin >> n >> x;
        vector<long long> a(n + 1);
        vector<int> l(n + 1), r(n + 1), in(n + 1);
        for (int i = 1; i <= n; ++i) {
            cin >> a[i] >> l[i] >> r[i];
            if (l[i])
                ++in[l[i]];
            if (r[i])
                ++in[r[i]];
        }
        int root = 1;
        while (in[root])
            ++root;
        int at = 0, ans = 0;
        function<void(int)> visit = [&](int u) {
            if (!u)
                return;
            visit(l[u]);
            ++at;
            if (!ans && a[u] == x)
                ans = at;
            visit(r[u]);
        };
        visit(root);
        cout << ans << '\n';
    }
    
    • 1

    信息

    ID
    2091
    时间
    1000ms
    内存
    64MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者