1 条题解
-
0
思路与算法
先统计每个孩子行号的入度,找到没有父亲的根。递归中序访问:先左子树,再把访问计数加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