国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

做了這么多題目了,會求左葉子之和么?

開發 前端
平時我們解二叉樹的題目時,已經習慣了通過節點的左右孩子判斷本節點的屬性,而本題我們要通過節點的父節點判斷本節點的屬性。

[[416239]]

本文轉載自微信公眾號「代碼隨想錄」,作者程序員Carl 。轉載本文請聯系代碼隨想錄公眾號。

左葉子之和

題目地址:https://leetcode-cn.com/problems/sum-of-left-leaves/

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

示例:

思路

首先要注意是判斷左葉子,不是二叉樹左側節點,所以不要上來想著層序遍歷。

因為題目中其實沒有說清楚左葉子究竟是什么節點,那么我來給出左葉子的明確定義:如果左節點不為空,且左節點沒有左右孩子,那么這個節點就是左葉子

大家思考一下如下圖中二叉樹,左葉子之和究竟是多少?

其實是0,因為這棵樹根本沒有左葉子!

那么判斷當前節點是不是左葉子是無法判斷的,必須要通過節點的父節點來判斷其左孩子是不是左葉子。

如果該節點的左節點不為空,該節點的左節點的左節點為空,該節點的左節點的右節點為空,則找到了一個左葉子,判斷代碼如下:

  1. if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) { 
  2.     左葉子節點處理邏輯 

遞歸法

遞歸的遍歷順序為后序遍歷(左右中),是因為要通過遞歸函數的返回值來累加求取左葉子數值之和。。

遞歸三部曲:

1.確定遞歸函數的參數和返回值

判斷一個樹的左葉子節點之和,那么一定要傳入樹的根節點,遞歸函數的返回值為數值之和,所以為int

使用題目中給出的函數就可以了。

2.確定終止條件

依然是

  1. if (root == NULLreturn 0; 

3.確定單層遞歸的邏輯

當遇到左葉子節點的時候,記錄數值,然后通過遞歸求取左子樹左葉子之和,和 右子樹左葉子之和,相加便是整個樹的左葉子之和。

代碼如下:

  1. int leftValue = sumOfLeftLeaves(root->left);    // 左 
  2. int rightValue = sumOfLeftLeaves(root->right);  // 右 
  3.                                                 // 中 
  4. int midValue = 0; 
  5. if (root->left && !root->left->left && !root->left->right) { 
  6.     midValue = root->left->val; 
  7. int sum = midValue + leftValue + rightValue; 
  8. return sum

整體遞歸代碼如下:

  1. class Solution { 
  2. public
  3.     int sumOfLeftLeaves(TreeNode* root) { 
  4.         if (root == NULLreturn 0; 
  5.  
  6.         int leftValue = sumOfLeftLeaves(root->left);    // 左 
  7.         int rightValue = sumOfLeftLeaves(root->right);  // 右 
  8.                                                         // 中 
  9.         int midValue = 0; 
  10.         if (root->left && !root->left->left && !root->left->right) { // 中 
  11.             midValue = root->left->val; 
  12.         } 
  13.         int sum = midValue + leftValue + rightValue; 
  14.         return sum
  15.     } 
  16. }; 

以上代碼精簡之后如下:

  1. class Solution { 
  2. public
  3.     int sumOfLeftLeaves(TreeNode* root) { 
  4.         if (root == NULLreturn 0; 
  5.         int midValue = 0; 
  6.         if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) { 
  7.             midValue = root->left->val; 
  8.         } 
  9.         return midValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); 
  10.     } 
  11. }; 

迭代法

本題迭代法使用前中后序都是可以的,只要把左葉子節點統計出來,就可以了,那么參考文章 二叉樹:聽說遞歸能做的,棧也能做!和二叉樹:迭代法統一寫法中的寫法,可以寫出一個前序遍歷的迭代法。

判斷條件都是一樣的,代碼如下:

  1. class Solution { 
  2. public
  3.     int sumOfLeftLeaves(TreeNode* root) { 
  4.         stack<TreeNode*> st; 
  5.         if (root == NULLreturn 0; 
  6.         st.push(root); 
  7.         int result = 0; 
  8.         while (!st.empty()) { 
  9.             TreeNode* node = st.top(); 
  10.             st.pop(); 
  11.             if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) { 
  12.                 result += node->left->val; 
  13.             } 
  14.             if (node->right) st.push(node->right); 
  15.             if (node->left) st.push(node->left); 
  16.         } 
  17.         return result; 
  18.     } 
  19. }; 

總結

這道題目要求左葉子之和,其實是比較繞的,因為不能判斷本節點是不是左葉子節點。

此時就要通過節點的父節點來判斷其左孩子是不是左葉子了。

平時我們解二叉樹的題目時,已經習慣了通過節點的左右孩子判斷本節點的屬性,而本題我們要通過節點的父節點判斷本節點的屬性。

希望通過這道題目,可以擴展大家對二叉樹的解題思路。

其他語言版本

Java

遞歸

  1. class Solution { 
  2.     public int sumOfLeftLeaves(TreeNode root) { 
  3.         if (root == nullreturn 0; 
  4.         int leftValue = sumOfLeftLeaves(root.left);    // 左 
  5.         int rightValue = sumOfLeftLeaves(root.right);  // 右 
  6.                                                         
  7.         int midValue = 0; 
  8.         if (root.left != null && root.left.left == null && root.left.right == null) { // 中 
  9.             midValue = root.left.val; 
  10.         } 
  11.         int sum = midValue + leftValue + rightValue; 
  12.         return sum
  13.     } 

迭代

  1. class Solution { 
  2.     public int sumOfLeftLeaves(TreeNode root) { 
  3.         if (root == nullreturn 0; 
  4.         Stack<TreeNode> stack = new Stack<> (); 
  5.         stack.add(root); 
  6.         int result = 0; 
  7.         while (!stack.isEmpty()) { 
  8.             TreeNode node = stack.pop(); 
  9.             if (node.left != null && node.left.left == null && node.left.right == null) { 
  10.                 result += node.left.val; 
  11.             } 
  12.             if (node.right != null) stack.add(node.right); 
  13.             if (node.left != null) stack.add(node.left); 
  14.         } 
  15.         return result; 
  16.     } 

Python

遞歸

  1. class Solution: 
  2.     def sumOfLeftLeaves(self, root: TreeNode) -> int
  3.         if not root:  
  4.             return 0 
  5.          
  6.         left_left_leaves_sum = self.sumOfLeftLeaves(root.left)  # 左 
  7.         right_left_leaves_sum = self.sumOfLeftLeaves(root.right) # 右 
  8.          
  9.         cur_left_leaf_val = 0 
  10.         if root.left and not root.left.left and not root.left.right:  
  11.             cur_left_leaf_val = root.left.val  # 中 
  12.              
  13.         return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum 

迭代

  1. class Solution: 
  2.     def sumOfLeftLeaves(self, root: TreeNode) -> int
  3.         ""
  4.         Idea: Each time check current node's left node.  
  5.               If current node don't have one, skip it.  
  6.         ""
  7.         stack = [] 
  8.         if root:  
  9.             stack.append(root) 
  10.         res = 0 
  11.          
  12.         while stack:  
  13.             # 每次都把當前節點的左節點加進去.  
  14.             cur_node = stack.pop() 
  15.             if cur_node.left and not cur_node.left.left and not cur_node.left.right:  
  16.                 res += cur_node.left.val 
  17.                  
  18.             if cur_node.left:  
  19.                 stack.append(cur_node.left
  20.             if cur_node.right:  
  21.                 stack.append(cur_node.right
  22.                  
  23.         return res 

 

責任編輯:武曉燕 來源: 代碼隨想錄
相關推薦

2021-03-24 08:44:11

代碼內存消耗語言

2021-06-09 10:10:20

代碼內存編程語言

2021-06-14 07:23:42

Windows10操作系統微軟

2018-05-09 11:04:35

Java程序員大數據

2017-08-11 14:21:33

軟件開發前端框架

2023-07-17 08:21:52

漏洞版本項目

2024-04-02 08:41:10

ArrayListSubList場景

2020-12-31 05:49:44

FlinkSQL函數

2020-12-14 07:31:57

JDKJVM監控

2018-06-26 15:00:24

Docker安全風險

2024-07-12 09:35:38

前端工具檢驗

2023-11-13 08:49:54

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2018-03-05 10:40:21

安卓APPGoogle

2023-07-07 19:23:08

微軟文字Claude

2022-01-12 20:04:09

網絡故障斷網事件網絡安全

2022-07-26 23:43:29

編程語言開發Java

2017-12-21 19:38:50

潤乾中間表

2021-01-14 05:08:44

編譯鏈接

2021-01-29 08:52:10

App微信移動應用
點贊
收藏

51CTO技術棧公眾號

91亚洲精品丁香在线观看| 蜜桃专区在线| 欧美啪啪免费视频| 国产中文字幕一区二区三区| 日韩成人中文电影| 日本免费中文字幕在线| 午夜伦理精品一区| av在线亚洲男人的天堂| 天天干天天色天天爽| www 四虎| 少妇视频在线| 久久久女女女女999久久| 深夜爽爽视频| 亚洲另类在线制服丝袜| 青青草国产精品视频| 国产麻豆精品久久一二三| 亚洲国产一区在线| 老司机午夜精品| 在线视频不卡国产| 国产精品88av| 久久这里只有精品8| 成人18视频日本| 蜜臀av色欲a片无码精品一区| 国产成人av一区二区| 日韩精品一区二区在线视频| 成人午夜电影小说| 黄色一级一级片| 成人欧美一区二区三区| 日本中文视频| 欧美性猛交一区二区三区精品| 老司机精品影院| 日韩成人中文字幕| 国产剧情一区二区在线观看| 91高清在线免费观看| 亚洲电影影音先锋| 欧美成人激情| 欧美性色黄大片| 国产精品高潮久久久久无| 蜜桃视频一区二区三区在线观看| 亚洲福利视频专区| 91av入口| 亚洲欧美日韩中文字幕一区二区三区 | 一区二区成人国产精品| 亚洲国产精品久久久男人的天堂| 大胆人体一区二区| 亚洲人成网站999久久久综合| 国产在线观看91一区二区三区| 亚洲精品99久久久久中文字幕| 国产日韩欧美一区二区| 影院欧美亚洲| 亚洲精品成人三区| heyzo一本久久综合| 亚欧激情乱码久久久久久久久| 国产直播在线| 日韩成人中文字幕| 秋霞一区二区| 91亚洲精品一区二区| 免费av成人在线| 污视频免费在线观看网站| 亚洲一区二区黄色| 免费网站在线观看人| 久久国产精品电影| 国产精品久久久久蜜臀 | av片在线观看| 久久久999精品视频| 精品一区不卡| 亚洲国产日韩美| 成人免费在线视频| 中国av在线播放| 久久久女人电视剧免费播放下载| 综合视频在线| 在线成人激情黄色| 在线观看亚洲视频啊啊啊啊| 懂色一区二区三区免费观看| 国产性一级片| 5858s免费视频成人| 成人综合网站| 97超级碰碰| 91亚洲精品久久久蜜桃网站| 久久久久久青草| 中文字幕日韩有码| 精品成人在线| 狠狠热免费视频| 日韩一级大片在线| 国内精品久久久久久99蜜桃| 激情图片qvod| 色94色欧美sute亚洲线路一久 | 成人av免费在线| 免费黄网站在线观看| 在线精品高清中文字幕| 红桃视频亚洲| 免费99热在线观看| 日韩精品在线视频观看| 亚洲国产精品久久久久蝴蝶传媒| www.av蜜桃| 欧美一区二区三区免费大片 | 亚洲欧洲另类| 国产日本视频| 色吧影院999| 午夜综合激情| 在线国产网址| 97在线视频观看| 国产激情一区二区三区桃花岛亚洲| 欧美欧美欧美| 国产91久久婷婷一区二区| av网站一区二区三区| 七七成人影院| 亚洲最大av在线| 中文字幕中文字幕在线一区 | 欧美aⅴ在线观看| 亚洲第一二三四五区| 国产精品国产三级国产在线观看 | 国产在线精品一区二区不卡了| 青青草视频在线免费观看| 欧美国产日本在线| 99这里只有精品| 自拍在线观看| 亚洲美女自拍偷拍| 日韩亚洲欧美高清| 亚洲看片一区| yiren22亚洲综合伊人22| 国产精品偷伦免费视频观看的| 国产女同性恋一区二区| 亚瑟国产精品| 国产精品无码人妻一区二区在线| 日韩成人免费视频| 精品无人码麻豆乱码1区2区| 伊人电影在线观看| 日本免费高清一区二区| 日韩一区二区三区在线| 午夜亚洲性色福利视频| 好了av在线| 日韩女优中文字幕| 欧美一区二区三区的| 久久久一二三| 黄色在线看片| 天堂v在线视频| 国产一区二区日韩精品欧美精品| 国产精品综合视频| 日韩成人精品一区二区三区| 欧美视频免费播放| 97在线视频国产| 亚洲国产欧美在线| 欧美日本久久| 日本精品600av| 777久久精品一区二区三区无码| 在线视频亚洲欧美| 欧美国产乱子伦| 欧美三级三级| 高清在线观看av| 日韩成人av网站| 亚洲人成在线播放| 亚洲国产成人自拍| 三级电影一区| 国内av免费| 国产精品高清在线观看| 中文字幕在线观看一区二区| 亚洲97av| 污污软件在线观看| 国产日韩一区欧美| 日韩欧美国产一区二区在线播放| 免费在线看一区| 深夜视频一区二区| 在线观看国产中文字幕| 国产精品一区二区三区毛片淫片| 欧美中文字幕不卡| 久久99精品视频| 国产色99精品9i| 中文字幕在线免费专区| 清纯唯美一区二区三区| 中文字幕亚洲无线码a| 欧美韩日一区二区三区四区| 久久久影院免费| 成人区精品一区二区不卡| 最近免费观看高清韩国日本大全| 久久综合国产精品台湾中文娱乐网| 国产精品久久久久影院| 93在线视频精品免费观看| 色屁屁www国产馆在线观看| 黄网站欧美内射| 国产日韩av高清| 日韩av中文字幕在线免费观看| 久久久国产午夜精品| 香蕉视频国产精品 | 国产区在线视频| 国产精品av免费| 韩国欧美亚洲国产| 欧美日韩欧美一区二区| bt7086福利一区国产| 亚洲精品二区三区| 秋霞国产精品| 免费在线视频你懂得| 免费拍拍拍网站| 国产美女被下药99| 日韩精品免费看| 亚洲综合视频在线| 国产精品18久久久久| 影音先锋日韩在线| gogo大尺度成人免费视频| av福利在线播放|