leetcode 404. 左葉子之和 詳細題解

題目:

計算給定二叉樹的所有左葉子之和。

兩種不同形式的遞歸解法:

兩個解法都是基於遞歸的,只是形式不一樣.
解法一需要一個全局變量,和一個額外的getSum()函數.這種寫法的好處是使代碼更加清晰易懂.
解法二則不需要額外的全局變量和函數.
總之兩種寫法思想都差不多,運行時間都是100%.具體代碼分析請看註釋.

解法一

int res = 0;//存儲結果

public int sumOfLeftLeaves(TreeNode root) {
    if(root==null)//root爲空直接返回0
        return res;
    getSum(root);//遞歸函數,求得結果
    return res;
}

public void getSum(TreeNode root) {
    if (root.left != null) {//root.left不能爲空
        //root.left爲左葉子
        if (root.left.left == null && root.left.right == null)
            res += root.left.val;//結果增加
        else//否則繼續遞歸
            getSum(root.left);
    }
    if (root.right != null)//root.right不能爲空
        getSum(root.right);
}

解法二

public int sumOfLeftLeaves(TreeNode root) {
    if (root == null)//root爲空直接返回0
        return 0;
    //left存root的左子樹的左葉子之和,right存右子樹的左葉子之和
    //若root.left爲左葉子,cur存root.left的值
    int left = 0, right = 0, cur = 0;
    //若root.left爲左葉子
    if (root.left != null && root.left.left == null && root.left.right == null)
        cur = root.left.val;//存下這片左葉子的值
    else//否則繼續遞歸
        left = sumOfLeftLeaves(root.left);//左子樹值
    right = sumOfLeftLeaves(root.right);//右子樹值
    return left + right + cur;//返回左子樹值(若root.left非左葉子)+右子樹值+root.left值(若root.
    left爲左葉子)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章