404. 左叶子之和
递归法:
cppclass Solution{ public: int sumOfLeftLeaves(TreeNode* root){ if(!root) return 0; if(!root->left&&!root->right) return 0; TreeNode* lf = root->left; TreeNode* rt = root->right; int lv = sumOfLeftLeaves(lf); if(lf&&!lf->left&&!lf->right){ lv = lf->val; } int rv = sumOfLeftLeaves(rt); return lv+rv; } };迭代法:
cppclass Solution{ public: int sumOfLeftLeaves(TreeNode* root){ if(!root) return 0; queue<TreeNode*> qu; int ans=0; qu.push(root); while(!qu.empty()){ TreeNode* node = qu.front(); qu.pop(); if(node->left&&!node->left->left&&!node->left->right){ ans += node->left->val; } if(node->left) qu.push(node->left); if(node->right) qu.push(node->right); } return ans; } };
其他:
(1)依旧递归新理解:
位置 区分情况 ,return 决定操作
(return就是当前节点类别函数意义的结果,比如这道题,如图)
(2)递归和迭代确实是两种不同的思维方式,迭代是从二叉树上挨个<揪下来>一个节点,递归则是我写一个规则,对这颗二叉树上的所有节点都适用(有点像单J、2J、3J车厘子的那个测量尺(bushi))
(3)这道题的迭代就比较简单,做判断的同时维护好迭代的队列就行
