[NowCoder] 樹上最長單色路徑

http://www.nowcoder.com/question/next?pid=1597148&qid=44665&tid=3119680

對于一棵由黑白點組成的二叉樹,我們需要找到其中最長的單色簡單路徑,其中簡單路徑的定義是從樹上的某點開始沿樹邊走不重復的點到樹上的另一點結束而形成的路徑,而路徑的長度就是經(jīng)過的點的數(shù)量(包括起點和終點)。而這里我們所說的單色路徑自然就是只經(jīng)過一種顏色的點的路徑。你需要找到這棵樹上最長的單色路徑。
給定一棵二叉樹的根節(jié)點(樹的點數(shù)小于等于300,請做到O(n)的復雜度),請返回最長單色路徑的長度。這里的節(jié)點顏色由點上的權值表示,權值為1的是黑點,為0的是白點。

測試用例:
[0,0,1,1,0,0,1,1,1,0,0,1]
對應輸出應該為:4
你的輸出為:5

解答;

  1. 記憶化搜索;
    2)注意符號的優(yōu)先級。。。逗號運算符。。。
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 {
/*
    記憶化搜索;
    每個節(jié)點植被搜索一次
    */
Map<TreeNode,Integer> blkMap = new HashMap<>();
    Map<TreeNode,Integer> 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;
    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,784評論 1 31
  • 定義指針變量,如果不賦給它地址,系統(tǒng)會隨機給它分配一個地址。 C++標準庫 C++ Standard Librar...
    縱我不往矣閱讀 346評論 0 1
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,392評論 0 12
  • 1 數(shù)據(jù)2 算法3 線性表4 棧5 隊列6 串樸素模式匹配算法 -子串的定位操作:從主串中找到子串KMP模式匹配算...
    oldSix_Zhu閱讀 1,622評論 0 4
  • 上帝呀,親愛的阿爸父,作為一個母親,我盡力盡我應盡的責任,但是,我有時感覺一個人實在是忙不過來呀,有些事能不讓老公...
    從心開始噢閱讀 228評論 0 0

友情鏈接更多精彩內(nèi)容