0
点赞
收藏
分享

微信扫一扫

【二叉树】二叉树中的伪回文路径


0x00 题目

给你一棵二叉树,每个节点的值为 ​​1​​​ 到 ​​9​​​ 我们称二叉树中的一条路径是 「伪回文」的
当它满足:路径经过的所有节点值的排列中
​存在​​一个​​回文​​序列

请你返回从​​根​​​到​​叶子​​​节点的所有路径中
​​​伪回文​​​ 路径的​​数目​

0x01 思路

一个回文数有以下特征:
情况一:​​​1221​​​,数字​​次数​​​是​​偶数​​​次
情况二:​​​121​​​,只有​​一个​​​数字出现​​奇数​​​次
根据位运算的异或运算:任何一个数 ​​​n​​​​n ^ n = 0​​ 可以通过​​异或​​运算​​消除​​偶数次的数

题目取值范围是​​1~9​​​ 所以可以用​​每一位​​​代表一个数字
​​​3​​​表示为:​​000000100​​​​5​​表示为:​​000010000​​ 如果最后剩下的数是 ​​3​​ 和 ​​5​​ 那么就是: ​​000010100​​ 有 ​​2​​ 个 ​​1​​,偶数次
所以​​不​​是回文数
通过循环 ​​右移​​ 和 ​​与运算​​来计算有多少个 ​​1​​ (10100 >> 1) & 1

还有更​​简单​​​的办法:
任何一个数:​​​n​​​ 通过位运算 ​​与运算​​ ​​&​​ n & (n - 1) = 0
10100 &
10011 =
10000
为不 0

0x02 解法

语言:​​Swift​

树节点:​​TreeNode​

public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}

解法:

func pseudoPalindromicPaths (_ root: TreeNode?) -> Int {
guard let root = root else { return 0 }
var res: Int = 0

func dfs(_ root: TreeNode?, _ val: Int) {
guard let root = root else { return }

// 异或运算
let n = val ^ (1 << root.val)
// 叶子节点
if root.left == nil && root.right == nil {
// 所有偶数次的数,都消除了
// 或者只剩下一个数
if n == 0 || (n & (n-1)) == 0 {
res += 1
}
return
}

// 递归左右子树
if let left = root.left {
dfs(left, n)
}
if let right = root.right {
dfs(right, n)
}
}

dfs(root, 0)
return res
}

0x03 我的小作品

欢迎体验我的作品之一:​​小五笔 86 版​​​ 五笔学习好帮手👍
​App Store​​ 搜索即可~


举报

相关推荐

0 条评论