1. 问题背景与理解
今天我们来聊聊LeetCode上的一道二叉树题目——1372. 二叉树中的最长交错路径。这道题在2023年的面试中出现的频率相当高,特别是对于应聘算法工程师和软件工程师的候选人来说,掌握这类树形DP问题是非常必要的。
什么是最长交错路径?简单来说,就是在二叉树中找出一条最长的路径,这条路径上的每一步都必须是"左-右-左-右..."或者"右-左-右-左..."交替进行的。比如,如果你上一步是从父节点向左走到当前节点,那么下一步就必须向右走,反之亦然。
这个问题看似简单,但要想出最优解还是需要一些技巧的。在实际面试中,我见过不少候选人一开始都会陷入暴力解的思维陷阱,导致时间复杂度不理想。下面我就来详细分析两种不同的解法思路,并比较它们的优劣。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双重递归解法解析
2.1 基本思路
第一种解法采用了双重递归的策略,这也是比较直观的一种思路。我们可以把它分解为两个主要步骤:
- 第一次递归(dfs函数):遍历树中的所有节点
- 第二次递归(recursion函数):从当前节点出发,按照特定方向进行交错路径探索
这种解法的核心在于使用一个哈希集合te来记录已经访问过的节点和方向组合,避免重复计算。
2.2 代码实现细节
让我们仔细看看代码中的关键部分:
cpp复制class Solution {
public:
int mx = 0;
unordered_set<unsigned long long> te;
int recursion(TreeNode* root, bool dir) {
if(root==nullptr) return 0;
int r;
te.insert((unsigned long long)(root) * 10 + (int)(dir));
if(dir) {
r = recursion(root->left, !dir);
} else {
r = recursion(root->right, !dir);
}
return r + 1;
}
