成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊有一種樹叫做累加樹!

開發 架構
給出二叉 搜索 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹(Greater Sum Tree),使每個節點 node 的新值等于原樹中大于或等于 node.val 的值之和。

[[422852]]

把二叉搜索樹轉換為累加樹

力扣題目:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/

給出二叉 搜索 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹(Greater Sum Tree),使每個節點 node 的新值等于原樹中大于或等于 node.val 的值之和。

提醒一下,二叉搜索樹滿足下列約束條件:

節點的左子樹僅包含鍵 小于 節點鍵的節點。節點的右子樹僅包含鍵 大于 節點鍵的節點。左右子樹也必須是二叉搜索樹。

示例 1:

把二叉搜索樹轉換為累加樹

  • 輸入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
  • 輸出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

  • 輸入:root = [0,null,1]
  • 輸出:[1,null,1]

示例 3:

  • 輸入:root = [1,0,2]
  • 輸出:[3,3,2]

示例 4:

  • 輸入:root = [3,2,4,1]
  • 輸出:[7,9,4,10]

提示:

  • 樹中的節點數介于 0 和 104 之間。
  • 每個節點的值介于 -104 和 104 之間。
  • 樹中的所有值 互不相同 。
  • 給定的樹為二叉搜索樹。

思路

一看到累加樹,相信很多小伙伴都會疑惑:如何累加?遇到一個節點,然后在遍歷其他節點累加?怎么一想這么麻煩呢。

然后再發現這是一顆二叉搜索樹,二叉搜索樹啊,這是有序的啊。

那么有序的元素如果求累加呢?

其實這就是一棵樹,大家可能看起來有點別扭,換一個角度來看,這就是一個有序數組[2, 5, 13],求從后到前的累加數組,也就是[20, 18, 13],是不是感覺這就簡單了。

為什么變成數組就是感覺簡單了呢?

因為數組大家都知道怎么遍歷啊,從后向前,挨個累加就完事了,這換成了二叉搜索樹,看起來就別扭了一些是不是。

那么知道如何遍歷這個二叉樹,也就迎刃而解了,從樹中可以看出累加的順序是右中左,所以我們需要反中序遍歷這個二叉樹,然后順序累加就可以了。

遞歸

遍歷順序如圖所示:

把二叉搜索樹轉換為累加樹

本題依然需要一個pre指針記錄當前遍歷節點cur的前一個節點,這樣才方便做累加。

pre指針的使用技巧,我們在二叉樹:搜索樹的最小絕對差和二叉樹:我的眾數是多少?都提到了,這是常用的操作手段。

遞歸函數參數以及返回值

這里很明確了,不需要遞歸函數的返回值做什么操作了,要遍歷整棵樹。

同時需要定義一個全局變量pre,用來保存cur節點的前一個節點的數值,定義為int型就可以了。

代碼如下:

  1. int pre; // 記錄前一個節點的數值 
  2. void traversal(TreeNode* cur) 
  • 確定終止條件

遇空就終止。

  1. if (cur == NULLreturn
  • 確定單層遞歸的邏輯

注意要右中左來遍歷二叉樹, 中節點的處理邏輯就是讓cur的數值加上前一個節點的數值。

代碼如下:

  1. traversal(cur->right);  // 右 
  2. cur->val += pre;        // 中 
  3. pre = cur->val; 
  4. traversal(cur->left);   // 左 

遞歸法整體代碼如下:

  1. class Solution { 
  2. private: 
  3.     int pre; // 記錄前一個節點的數值 
  4.     void traversal(TreeNode* cur) { // 右中左遍歷 
  5.         if (cur == NULLreturn
  6.         traversal(cur->right); 
  7.         cur->val += pre; 
  8.         pre = cur->val; 
  9.         traversal(cur->left); 
  10.     } 
  11. public
  12.     TreeNode* convertBST(TreeNode* root) { 
  13.         pre = 0; 
  14.         traversal(root); 
  15.         return root; 
  16.     } 
  17. }; 

迭代法

迭代法其實就是中序模板題了,在二叉樹:前中后序迭代法和二叉樹:前中后序統一方式迭代法可以選一種自己習慣的寫法。

這里我給出其中的一種,代碼如下:

  1. class Solution { 
  2. private: 
  3.     int pre; // 記錄前一個節點的數值 
  4.     void traversal(TreeNode* root) { 
  5.         stack<TreeNode*> st; 
  6.         TreeNode* cur = root; 
  7.         while (cur != NULL || !st.empty()) { 
  8.             if (cur != NULL) { 
  9.                 st.push(cur); 
  10.                 cur = cur->right;   // 右 
  11.             } else { 
  12.                 cur = st.top();     // 中 
  13.                 st.pop(); 
  14.                 cur->val += pre; 
  15.                 pre = cur->val; 
  16.                 cur = cur->left;    // 左 
  17.             } 
  18.         } 
  19.     } 
  20. public
  21.     TreeNode* convertBST(TreeNode* root) { 
  22.         pre = 0; 
  23.         traversal(root); 
  24.         return root; 
  25.     } 
  26. }; 

總結

經歷了前面各種二叉樹增刪改查的洗禮之后,這道題目應該比較簡單了。

好了,二叉樹已經接近尾聲了,接下來就是要對二叉樹來一個大總結了。

其他語言版本

Java

  1. class Solution { 
  2.     int sum
  3.     public TreeNode convertBST(TreeNode root) { 
  4.         sum = 0; 
  5.         convertBST1(root); 
  6.         return root; 
  7.     } 
  8.  
  9.     // 按右中左順序遍歷,累加即可 
  10.     public void convertBST1(TreeNode root) { 
  11.         if (root == null) { 
  12.             return
  13.         } 
  14.         convertBST1(root.right); 
  15.         sum += root.val; 
  16.         root.val = sum
  17.         convertBST1(root.left); 
  18.     } 

Python

遞歸法

  1. class Solution: 
  2.     def convertBST(self, root: TreeNode) -> TreeNode: 
  3.         def buildalist(root): 
  4.             if not root: return None 
  5.             buildalist(root.right)  #右中左遍歷 
  6.             root.val += self.pre 
  7.             self.pre = root.val 
  8.             buildalist(root.left
  9.         self.pre = 0  #記錄前一個節點的數值 
  10.         buildalist(root) 
  11.         return root 

本文轉載自微信公眾號「代碼隨想錄」,可以通過以下二維碼關注。轉載本文請聯系代碼隨想錄公眾號。

 

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

2022-06-22 12:54:58

人工智能機器人元宇宙

2023-11-04 16:28:54

2013-03-26 22:32:48

2018-06-07 13:17:12

契約測試單元測試API測試

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2022-09-26 08:03:25

VMware虛擬機

2021-05-12 18:02:23

方法創建線程

2023-02-09 10:39:15

gRPC通信模式

2024-09-09 08:29:25

2020-08-12 08:34:16

開發安全We

2021-01-01 09:01:05

前端組件化設計

2022-11-26 00:00:06

裝飾者模式Component

2020-06-28 09:30:37

Linux內存操作系統

2022-10-08 11:33:56

邊緣計算云計算

2018-01-10 14:13:04

測試矩陣API測試

2019-12-17 10:06:18

CDMA高通4G

2022-03-08 16:10:38

Redis事務機制

2020-09-08 06:54:29

Java Gradle語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费一区二区三区视频网站 | 日韩在线一区二区三区 | 美女久久视频 | 欧美精品久久 | 91久久精品国产91久久性色tv | 午夜视频免费在线观看 | 91精品国产综合久久婷婷香蕉 | 国产精品二区三区在线观看 | 国产精品无码久久久久 | 二区精品 | 一区二区三区中文字幕 | 欧美一区二区三区在线看 | 欧美jizzhd精品欧美巨大免费 | 日韩一区二区三区视频在线播放 | 黄色电影在线免费观看 | 91麻豆精品国产91久久久久久久久 | 日韩成人免费视频 | 国产精品久久久久久久7电影 | 欧美成人精品一区二区三区 | 欧美精品国产一区二区 | 亚洲成人国产精品 | 日本视频在线 | 欧美一区二区 | 中文字幕免费在线观看 | 久久精品国产一区二区三区 | 中文字幕一区在线观看视频 | 嫩草视频入口 | 中文字幕亚洲国产 | 中文字幕日韩欧美一区二区三区 | 亚洲高清视频在线 | 国产精品99久久久久久久vr | 中文字幕 视频一区 | 久久激情网 | 欧美亚州 | 日本三级在线视频 | 国产精品不卡 | 亚洲三区在线 | 精品国产免费一区二区三区演员表 | 97精品国产 | 久综合| 亚洲v区 |