5418.二叉树中的伪回文路径

image-20200524155918673

提示

  • 给定二叉树的节点数目在 110^5 之间。
  • 节点值在 19 之间。

思路

  • 首先通过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);
       }
    }

使用位运算优化判断伪回文路径过程

思路

image-20200524163618464

代码

   /**
     * 优化
     * 通过位运算 判定是否为 伪回文路径
     * 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);
        }
    }

参考原文:

wxxxxxxx:位运算解法2ms

posted @ 2020-05-24 16:43  YH_Simon  阅读(194)  评论(0编辑  收藏  举报