- 我上来就是BFS
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
if(root!=null){
queue.add(root);
}
int sum=0;
while(!queue.isEmpty()){
int n=queue.size();
for(int i=0;i<n;i++){
TreeNode node = queue.poll();
if(node.left!=null){
queue.add(node.left);
TreeNode tmp=node.left;
if(tmp.left==null&&tmp.right==null){//左叶子节点
sum+=tmp.val;
}
}
if(node.right!=null){
queue.add(node.right);
}
}
}
return sum;
}
}
- dfs
判断是否为空树,
如果是空树,返回0;
如果不是空树,判断左孩子节点是否为左叶子节点
然后继续遍历左子树和右子树中的孩子节点,并把结果累加起来。
int sum=0;
public int sumOfLeftLeaves(TreeNode root) {
dfs(root);
return sum;
}
public void dfs(TreeNode root){
if(root==null){
return;
}
if(root.left!=null&&root.left.left==null&&root.left.right==null){
sum+=root.left.val;
}
dfs(root.left);
dfs(root.right);
}
}
- bfs YYDS
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
if(root!=null){
queue.add(root);
}
int res=0;
while(!queue.isEmpty()){
int n=queue.size();
for(int i=0;i<n;i++){
TreeNode node = queue.poll();
if(i==0){// 记录最后一行第一个元素
res=node.val;
}
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
}
return res;
}
}
- dfs(每次递归都要看答案。。。
int maxDepth=0,res;
public int findBottomLeftValue(TreeNode root) {
dfs(root,1);
return res;
}
public void dfs(TreeNode root,int depth){
if(root==null){
return;
}
//每次第一次搜索到当前深度 depth 且 depth > maxDepth 的时候,必然是当前深度的最左节点,此时用当前节点值更新res
if(depth>maxDepth){
maxDepth=depth;
res=root.val;
}
dfs(root.left,depth+1);
dfs(root.right,depth+1);
}
}