算法第十五天|二叉樹

513. 找樹左下角的值

    List<Integer> list = new ArrayList<>();// 層序遍歷只存放最左邊的一個(gè)

    public int findBottomLeftValue(TreeNode root) {

        getValueByLevel(root, 0);
        return list.get(list.size() - 1);
    }

    private void getValueByLevel(TreeNode root, int deep) {
        if (root == null) {
            return;
        }
        if (list.size() == deep) {
            list.add(root.val);
        }
        getValueByLevel(root.left, deep + 1);
        getValueByLevel(root.right, deep + 1);
    }

因?yàn)閷有虮闅v是從左到右放入列表中,那么只用放入頭一個(gè)。取出最后一層的數(shù)據(jù)即可

112. 路徑總和

    public boolean hasPathSum(TreeNode root, int targetSum) {
        return pathSum(root, 0, targetSum);
    }

    private Boolean pathSum(TreeNode root, int sum, int targetSum) {
        if (root == null) {
            return false;
        }

        sum = sum + root.val;
        if (root.left == null && root.right == null) { // 葉子節(jié)點(diǎn)
            return targetSum == sum;
        }

        // 當(dāng)前節(jié)點(diǎn)不是根節(jié)點(diǎn)
        Boolean left = pathSum(root.left, sum, targetSum);  //左子樹是否能找到
        Boolean right = pathSum(root.right, sum, targetSum);  //右子樹是否能找到
        return left || right;
    }


    public boolean hasPathSum2(TreeNode root, int targetSum) {
        if(root == null) {
            return false;
        }
    
        if (root.left == null && root.right == null) { // 葉子節(jié)點(diǎn)
            return targetSum == root.val;
        }
    
        return hasPathSum2(root.right, targetSum - root.val) || hasPathSum2(root.left, targetSum - root.val);
    }

從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑總和,意味著要從根節(jié)點(diǎn)算起。

尋找到葉子節(jié)點(diǎn),返回葉子節(jié)點(diǎn)的結(jié)果。然后判斷左子樹和右子樹的通路

113. 路徑總和 II

    List<List<Integer>> list = new ArrayList<>();

    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        getPath(root, new ArrayList<>(), targetSum);
        return list;
    }

    private void getPath(TreeNode root, ArrayList<Integer> value, int targetSum) {
        if (root == null) {
            return;
        }

        value.add(root.val);

        getPath(root.left, value, targetSum - root.val);
        getPath(root.right, value, targetSum - root.val);

        if (root.left == null && root.right == null) {
            if (targetSum == root.val) {
                list.add(new ArrayList<>(value));
            }
        }

        // 回溯
        targetSum += value.get(value.size() - 1);
        value.remove(value.size() - 1);
    }

因?yàn)樽詈笠龌厮?,所以是一個(gè)后序二叉樹遍歷

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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