题目是LeetCode第190场周赛的第三题,链接:1457. 二叉树中的伪回文路径。具体描述见原题。
题目其实也不难,就是DFS+回溯的题目。这里判断是否伪回文路径的做法比较简单,直接判断路径上各个数字出现次数中为奇数的有多少个,只要超过两个就可以判定不是伪回文了,因为伪回文最多只有一个数字出现的次数为奇数(这个数刚好是中间位置的时候)。DFS的过程其实就是在记录(增加)各个数字的出现次数,回溯的过程则是恢复(减少)数字的出现次数。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)(二叉树退化为单链表的最坏情况下的递归栈空间)。
JAVA版代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int[] numCount;
private int result;
private void dfs(TreeNode node, int oddCount) {
if (node == null) {
if (oddCount <= 1) {
++result;
}
return;
}
// 奇数情况+1
oddCount += (++numCount[node.val - 1] & 1) * 2 - 1;
if (node.left == null && node.right == null) {
dfs(node.left, oddCount);
}
if (node.left != null) {
dfs(node.left, oddCount);
}
if (node.right != null) {
dfs(node.right, oddCount);
}
// 奇数情况下,回溯时-1
oddCount += 1 - (numCount[node.val - 1] & 1) * 2;
--numCount[node.val - 1];
}
public int pseudoPalindromicPaths (TreeNode root) {
numCount = new int[9];
result = 0;
dfs(root, 0);
return result;
}
}
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/30e20a61d019c6800189a8c163030a65.png)
Python版代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def pseudoPalindromicPaths (self, root: TreeNode) -> int:
self.result = 0
count = [0] * 10
def dfs(node, oddCount):
if not node:
if oddCount <= 1:
self.result += 1
return
count[node.val] += 1
oddCount += 1 if (count[node.val] & 1) == 1 else -1
if not node.left and not node.right:
dfs(node.left, oddCount)
if node.left:
dfs(node.left, oddCount)
if node.right:
dfs(node.right, oddCount)
oddCount -= 1 if (count[node.val] & 1) == 1 else -1
count[node.val] -= 1
dfs(root, 0)
return self.result
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a3f50e50399cf196c544573c3f4cf5d8.png)