zoukankan      html  css  js  c++  java
  • 0404左子叶之和 Marathon

    计算给定二叉树的所有左叶子之和。

    示例:

    在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/sum-of-left-leaves

    参考:

    python

    # 404.左子叶之和
    class Solution:
        def sumOfLeftLeaves(self, root: TreeNode) -> int:
            """
            前序递归
            :param root:
            :return:
            """
            if not root:
                return 0
    
            # 左子树左叶子和
            leftLeftLeavesSum = self.sumOfLeftLeaves(root.left)
            # 右子树左叶子和
            rightLeftLeavesSum = self.sumOfLeftLeaves(root.right)
    
            curLeftLeafVal = 0
            if root.left and not root.left.left and not root.left.right:
                curLeftLeafVal = root.left.val # 中
    
            return curLeftLeafVal + leftLeftLeavesSum + rightLeftLeavesSum
    
    class Solution2:
        def sumOfLeftLeaves(self, root: TreeNode) -> int:
            stack = []
            if root:
                stack.append(root)
            sum = 0
    
            while stack:
                # 每次放入当前节点的左节点
                curNode = stack.pop()
                if curNode.left and not curNode.left.left and not curNode.left.right:
                    sum += curNode.left.val
    
                if curNode.left:
                    stack.append(curNode.left)
                if curNode.right:
                    stack.append(curNode.right)
    
            return sum
    
    
    

    golang

    package binaryTree
    
    import "container/list"
    
    // 递归法
    func sumOfLeftLeaves1(root *TreeNode) int {
    	var res int
    	findLeft(root, &res)
    	return res
    }
    
    func findLeft(root *TreeNode, res *int)  {
    	if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil {
    		*res = *res + root.Left.Val
    	}
    	if root.Left != nil {
    		findLeft(root.Left, res)
    	}
    	if root.Right != nil {
    		findLeft(root.Right, res)
    	}
    }
    
    // 迭代法
    func sumOfLeftLeaves2(root *TreeNode) int {
    	var res int
    	queue := list.New()
    	queue.PushBack(root)
    	for queue.Len() > 0 {
    		length := queue.Len()
    		for i:=0;i<length;i++ {
    			node := queue.Remove(queue.Front()).(*TreeNode)
    			if node.Left != nil && node.Left.Left == nil && node.Left.Right == nil {
    				res = res + node.Left.Val
    			}
    			if node.Left != nil {
    				queue.PushBack(node.Left)
    			}
    			if node.Right != nil {
    				queue.PushBack(node.Right)
    			}
    		}
    	}
    	return res
    }
    
  • 相关阅读:
    Java Web学习笔记3
    Java学习笔记11
    diff 比较两个文件的差异
    Java学习笔记10
    appium——如何导出夜神模拟器下载“微信”app的apk
    python之文件操作模块(os和shutil)
    浅谈HTTP和HTTPS
    LUNIX命令集
    ubuntu软件管理工具的使用——dpkg和apt
    CSS学习—day1
  • 原文地址:https://www.cnblogs.com/davis12/p/15554371.html
Copyright © 2011-2022 走看看