[NowCoder]ツリー上の最長単色パス

2941 ワード

http://www.nowcoder.com/question/next?pid=1597148&qid=44665&tid=3119680
白黒点からなる二叉木の場合、最も長い単色の単純な経路を見つける必要があります.単純な経路の定義は、木の上の点から木の端に沿って重複しない点から木の上の別の点まで歩いて終わる経路であり、経路の長さは通過した点の数(起点と終点を含む)です.ここで私たちが言っている単色パスは、自然に1つの色の点だけを通るパスです.この木で一番長い単色の経路を見つける必要があります.ツリーのルートノード(ツリーの点数が300以下の場合はO(n)の複雑さ)を指定し、最長単色パスの長さを返します.ここでのノードカラーはポイント上の重み値で表され,重み値が1のは黒点,0のは白点である.
    :
[0,0,1,1,0,0,1,1,1,0,0,1]
       :4
     :5

回答;
  • 記憶化検索;2)記号の優先度に注意する...カンマ演算子...
  • import java.util.*;
    
    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
        public TreeNode(int val) {
            this.val = val;
        }
    }*/
    public class LongestPath {
    /*
             ;
                  
        */
    Map blkMap = new HashMap<>();
        Map whtMap = new HashMap<>();
        Integer maxPath = 0;
    
        public int findPath(TreeNode root) {
            // write code here
            if(root == null) return 0;
            dfsNode(root);
            return maxPath;
        }
    
        private void dfsNode(TreeNode root){
            blkPath(root);
            whtPath(root);
            if(root.left != null) dfsNode(root.left);
            if(root.right != null) dfsNode(root.right);
        }
    
        private int blkPath(TreeNode root){
            if(root.val == 0){
                blkMap.put(root,0);
                return 0;
            }
            int left = 0, right = 0;
            if(root.left != null){
                if(blkMap.get(root.left) == null)
                    blkPath(root.left);
                left = blkMap.get(root.left);
            }
            if(root.right!= null){
                if(blkMap.get(root.right) == null)
                    blkPath(root.right);
                right = blkMap.get(root.right);
            }
            /*
            ldft -> root -> right
            */
            int path = 1 + left + right;
            maxPath = maxPath >= path ? maxPath:path;
            /*
            parent -> root -> [left|right]
            */
            int maxChild = 1 + (left >= right ? left:right);
            blkMap.put(root,maxChild);
            return maxChild;
        }
    
        private int whtPath(TreeNode root){
            if(root.val == 1){
                whtMap.put(root,0);
                return 0;
            }
    
            int left = 0, right = 0;
            if(root.left != null){
                if(whtMap.get(root.left) == null)
                    whtPath(root.left);
                left = whtMap.get(root.left);
            }
            if(root.right!= null){
                if(whtMap.get(root.right) == null)
                    whtPath(root.right);
                right = whtMap.get(root.right);
            }
            /*
            ldft -> root -> right
            */
            int path = 1 + left + right;
            maxPath = maxPath >= path ? maxPath:path;
            /*
            parent -> root -> [left|right]
            */
            int maxChild = 1 + (left >= right ? left:right);
            whtMap.put(root,maxChild);
            return maxChild;
        }
    }