二叉树中的伪回文路径
难度:
标签:
题目描述
给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。
请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。
示例 1:
输入:root = [2,3,1,3,1,null,1] 输出:2 解释:上图为给定的二叉树。总共有 3 条从根到叶子的路径:红色路径 [2,3,3] ,绿色路径 [2,1,1] 和路径 [2,3,1] 。 在这些路径中,只有红色和绿色的路径是伪回文路径,因为红色路径 [2,3,3] 存在回文排列 [3,2,3] ,绿色路径 [2,1,1] 存在回文排列 [1,2,1] 。
示例 2:
输入:root = [2,1,1,1,3,null,null,null,null,null,1] 输出:1 解释:上图为给定二叉树。总共有 3 条从根到叶子的路径:绿色路径 [2,1,1] ,路径 [2,1,3,1] 和路径 [2,1] 。 这些路径中只有绿色路径是伪回文路径,因为 [2,1,1] 存在回文排列 [1,2,1] 。
示例 3:
输入:root = [9] 输出:1
提示:
- 给定二叉树的节点数目在范围
[1, 105]
内 1 <= Node.val <= 9
代码结果
运行时间: 296 ms, 内存: 45.5 MB
/*
* 题目思路:
* 这里我们仍然需要遍历所有从根到叶子的路径,但是利用Java Stream API来简化代码。
* 我们将深度优先搜索(DFS)与Stream结合,使用Bit Manipulation来记录每个数字的出现次数。
* 使用位运算可以更高效地记录出现次数,并检查是否为伪回文。
*/
import java.util.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public int pseudoPalindromicPaths (TreeNode root) {
return dfs(root, 0);
}
private int dfs(TreeNode node, int path) {
if (node == null) return 0;
path ^= (1 << node.val);
if (node.left == null && node.right == null) {
return Integer.bitCount(path) <= 1 ? 1 : 0;
}
return dfs(node.left, path) + dfs(node.right, path);
}
}
解释
方法:
该题解采用的是深度优先搜索(DFS)的方法。在递归过程中,使用一个整数mask来跟踪路径上节点值出现的奇偶次数。mask的每一位对应一个数字(1-9),如果某一位是1,则表示对应的数字出现了奇数次,如果是0,则表示出现了偶数次。当到达叶子节点时,检查mask中1的个数,如果小于等于1,则说明这条路径是伪回文的。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在递归函数中,你是如何利用整数`mask`来跟踪每个节点值出现的奇偶次数的?
▷🦆
当检查到达的是叶子节点时,`mask & (mask - 1) == 0`这个条件是如何确保路径上的数字可以排列成回文结构的?
▷🦆
为什么选择使用位运算来跟踪节点值的出现次数,而不是使用哈希表或数组?
▷🦆
在伪回文路径判断中,只考虑节点值为1到9的限制会对算法的通用性有哪些影响?
▷