1. 程式人生 > 實用技巧 >Leetcode 404 - 左葉子之和

Leetcode 404 - 左葉子之和

1 題目

https://leetcode-cn.com/problems/sum-of-left-leaves/

2 題意

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

示例:

    3
   / \
  9  20
    /  \
   15   7

在這個二叉樹中,有兩個左葉子,分別是 9 和 15,所以返回 24

3 解題思路

author's blog == http://www.cnblogs.com/toulanboy/

該題比較簡單,考核的是二叉樹的遍歷。
(1)使用先、中、後,任意一種去遍歷所有節點,然後逐一判斷是否是左葉子。
(2)左葉子判斷邏輯為:當前節點是葉子,再判斷是否是其父親的左孩子

**如何知道其是否是其父親的左孩子? **
答:函式引數考慮多一個父親指標,這樣就可以時刻知道該節點的父親。

4 程式碼實現

//author's blog == http://www.cnblogs.com/toulanboy/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int ans = 0;
    //函式邏輯:使用先序遍歷,遍歷所有節點。然後逐一判斷節點是否是左葉子
    //引數:root當前樹的根, father是root的父親(用來判斷是否是其左孩子)
    void get_ans(TreeNode * root, TreeNode * father){
        if(root == NULL)//空樹返回
            return;
        //左葉子判斷:當前節點是葉子,再判斷是否是其父親的左孩子
        if(root->left == NULL && root->right == NULL && father && root == father->left){
            ans += root->val;
        }
        get_ans(root->left, root);// 遍歷左子樹
        get_ans(root->right, root);// 遍歷右子樹
    }
    int sumOfLeftLeaves(TreeNode* root) {
        get_ans(root, NULL);
        return ans;
    }
};