提示
- 给定二叉树的节点数目在
1
到10^5
之间。 - 节点值在
1
到9
之间。
思路
- 首先通过List集合记录 二叉树中从根节点到各个叶子节点的所有路径
- 判断每条路径是否为 伪回文路径
- 若路径长度为奇数,则该路径中 相同值的节点数目除只有一个为奇数之外,其余数目都是偶数
- 若路径长度为偶数,则该路径中 相同值的节点数目皆为偶数
代码
/*
* 52ms
*/
public int pseudoPalindromicPaths(TreeNode root) {
List<String> paths=new ArrayList<>();
int ans=0;
getPath(root,paths,root.val+"");
for(String path:paths){
if(check(path)){
ans++;
}
}
return ans;
}
public boolean check(String path){
int[] counts=new int[10];
boolean flag=true;
int len=path.length();
for(char c:path.toCharArray()){
counts[c-'0']+=1;
}
//长度为偶数
if(len%2==0){
for(int i=1;i<=9;i++){
if(counts[i]%2!=0){
flag=false;
break;
}
}
}else{
int oddCount=0;
for(int i=1;i<=9;i++){
if(oddCount>1){
flag=false;
break;
}
if(counts[i]%2==1){
oddCount++;
}
}
}
return flag;
}
public void getPath(TreeNode node,List<String> paths,String s) {
if(node.left==null&&node.right==null){
paths.add(s);
return;
}
if(node.left!=null){
getPath(node.left, paths, s+node.left.val);
}
if(node.right!=null){
getPath(node.right, paths, s+node.right.val);
}
}
使用位运算优化判断伪回文路径过程
思路
代码
/**
* 优化
* 通过位运算 判定是否为 伪回文路径
* 2ms
*/
private int count;
public int pseudoPalindromicPaths2(TreeNode root){
count=0;
if(root==null) return count;
dfs(root,0);
return count;
}
private void dfs(TreeNode node, int v) {
v^=(1<<node.val);//node节点的val为几就左移几位
if(node.left==null&&node.right==null){
if(v==0||(v&(v-1))==0){//判断是否为回文
count++;
}
return;
}
if(node.left!=null){
dfs(node.left, v);
}
if(node.right!=null){
dfs(node.right, v);
}
}
参考原文: