1. 程式人生 > 實用技巧 >LeetCode題解No404——“左葉子之和”

LeetCode題解No404——“左葉子之和”

LeetCode題解

No404

難度:Easy

題目描述:

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

示例:

    3
   / \
  9  20
    /  \
   15   7

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/sum-of-left-leaves
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
 */

題目思路

   今天的題目也是非常簡單的二叉樹的題目,一般對於這種題目,都有DFS和BFS兩種方法去解決,首先DFS就先遞迴,找到每一個分支的最左邊的節點,加上該葉子的值即可。主要是注意遞迴的順序。BFS就需要去維護一個佇列,對二叉樹進行層序遍歷,按層遍歷,當找到一個節點是上個節點的左節點並且該節點沒有葉節點的時候,ans+=該節點的值即可。

public class No404 {
   public class TreeNode{
       int val;
       TreeNode left;
       TreeNode right;
       TreeNode(int x){
           val = x;
       }
   }

   public static void main(String[] args) {

   }
   // 遞迴遍歷
   public int sumOfLeftLeavesRecursion(TreeNode root){
       // 特判
       if (root == null){
           return 0;
       }

       return dfs(root);
   }

   private int dfs(TreeNode root) {
       int ans = 0;
       if (root.left!=null){
           if (isLeafNode(root.left)){
               ans += root.left.val;
           }else {
               ans += dfs(root.left);
           }
       }
       if (root.right != null){
           ans += dfs(root.right);
       }
       return ans;
   }

   // 層序遍歷
   public int sumOfLeftLeaves(TreeNode root) {
       // 特判
       if (root == null){
           return 0;
       }
       // 用一個佇列儲存
       Queue<TreeNode> queue = new LinkedList<>();

       // 入隊root
       queue.offer(root);

       // 結果
       int sum = 0;

       //迭代
       while (!queue.isEmpty()){
           TreeNode cur = queue.poll();
           if (cur.left!=null){
               if (isLeafNode(cur.left)){
                   sum+=cur.left.val;
               }else {
                   queue.offer(cur.left);
               }
           }
           if (cur.right!=null){
               if (!isLeafNode(cur.right)){
                   queue.offer(cur.right);
               }
           }
       }
       return sum;
   }

   public boolean isLeafNode(TreeNode root){
       if (root.right == null && root.left == null){
           return true;
       }
       return false;
   }
}

糾錯

最開始沒有理解題意,以為是加上左子樹的所有節點的和,後面跑測試的時候發現結果不對,又重新審了題目,最後改正過來。

執行結果

BFS

DFS