leetcode-master/problems/0404.左叶子之和.md

2.4 KiB
Raw Blame History

题目地址

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

思路

首先要注意是判断左叶子呢,不是左子树,不要上来想着层序遍历。

因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子

大家思考一下如下图中二叉树,左叶子之和究竟是多少?

其实是0因为这棵树根本没有左叶子

那么判断左叶子,如果判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

判断的根据如下:

    if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
        sum = node->left->val;
    }

递归写法代码如下:

递归C++代码

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if (root == NULL) return 0;
        int sum = 0;
        if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {
            sum = root->left->val;
        }
        return sum + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
    }
};

递归的过程其实就是二叉树的前序遍历,那么写过二叉树的同学都知道,既然是二叉树的前序遍历,能写出递归,就能写出非递归。

如果对二叉树的各种递归和非递归的写法不熟悉,可以看我的这个题解: 彻底吃透二叉树的前中后序递归法和迭代法!!

那么非递归版本善良登场,判断条件都是一样的

非递归C++代码


class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        stack<TreeNode*> st;
        if (root == NULL) return 0;
        st.push(root);
        int result = 0;
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
                result += node->left->val;
            }
            if (node->right) st.push(node->right);
            if (node->left) st.push(node->left);
        }
        return result;
    }


};