LeetCode: 404.左葉子節點

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

示例:

3
/ \
9 20
/ \
15 7

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

解析

我們需要找到這樣的節點

  • 屬於葉子節點
  • 屬於父節點的左子節點

方法一:用棧,dfs遍歷,用全局變量res作爲累積和。遍歷的過程中傳遞該節點是否是左子節點。同時判斷左右子節點是否爲None,則可以知道是不是左葉子節點。

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        stack = []
        res = 0
        if not root:
            return res
        stack.append((root, 0))
        while len(stack) != 0:
            p, flag = stack.pop()
            if flag == 1:
                if p.left == p.right == None:
                    res += p.val
            if p.right:
                stack.append((p.right, 0))
            if p.left:
                stack.append((p.left, 1))    
        return res

方法二,用遞歸遍歷。遍歷到左葉子節點則加上左葉子節點的值。

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        self.res = 0
        def walk(p):
            if p:
                if p.left:
                    if p.left.left == p.left.right == None:
                        self.res += p.left.val
                    walk(p.left)
                if p.right:
                    walk(p.right)
        walk(root)
        return self.res

方法三, 仍是遞歸,沒有使用全局變量。而是使用在遞歸函數內部累積的方式(即有返回值)。遍歷到左葉子節點,則返回值就在此基礎上加上右節點的遍歷。

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if root == None:
            return 0
        res = 0
        if root.left:
            if root.left.left == root.left.right == None:
               res += root.left.val
        return res + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)

方法四,在遞歸的過程中,用一個形參記錄該節點是否爲左孩子點。和用stack遍歷類似。

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        def cal(p, dir):
            if not p:
                return 0
            if p.left == p.right == None:
                if dir == 1:
                    return p.val
                else:
                    pass      
            return cal(p.left, 1) + cal(p.right, 0)
        return cal(root, 0)

方法五,當然還能用bfs遍歷,遍歷到左葉子節點就加上去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章