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

二叉樹的遞歸遍歷,套路都在這里

開發 前端
本篇將介紹前后中序的遞歸寫法,一些同學可能會感覺很簡單,其實不然,我們要通過簡單題目把方法論確定下來,有了方法論,后面才能應付復雜的遞歸。

[[410967]]

二叉樹的遞歸遍歷

這次我們要好好談一談遞歸,為什么很多同學看遞歸算法都是“一看就會,一寫就廢”。

主要是對遞歸不成體系,沒有方法論,每次寫遞歸算法 ,都是靠玄學來寫代碼,代碼能不能編過都靠運氣。

本篇將介紹前后中序的遞歸寫法,一些同學可能會感覺很簡單,其實不然,我們要通過簡單題目把方法論確定下來,有了方法論,后面才能應付復雜的遞歸。

這里幫助大家確定下來遞歸算法的三個要素。每次寫遞歸,都按照這三要素來寫,可以保證大家寫出正確的遞歸算法!

確定遞歸函數的參數和返回值:確定哪些參數是遞歸的過程中需要處理的,那么就在遞歸函數里加上這個參數, 并且還要明確每次遞歸的返回值是什么進而確定遞歸函數的返回類型。

確定終止條件:寫完了遞歸算法, 運行的時候,經常會遇到棧溢出的錯誤,就是沒寫終止條件或者終止條件寫的不對,操作系統也是用一個棧的結構來保存每一層遞歸的信息,如果遞歸沒有終止,操作系統的內存棧必然就會溢出。

確定單層遞歸的邏輯:確定每一層遞歸需要處理的信息。在這里也就會重復調用自己來實現遞歸的過程。

好了,我們確認了遞歸的三要素,接下來就來練練手:

以下以前序遍歷為例:

確定遞歸函數的參數和返回值:因為要打印出前序遍歷節點的數值,所以參數里需要傳入vector在放節點的數值,除了這一點就不需要在處理什么數據了也不需要有返回值,所以遞歸函數返回類型就是void,代碼如下:

  1. void traversal(TreeNode* cur, vector<int>& vec) 

確定終止條件:在遞歸的過程中,如何算是遞歸結束了呢,當然是當前遍歷的節點是空了,那么本層遞歸就要要結束了,所以如果當前遍歷的這個節點是空,就直接return,代碼如下:

  1. if (cur == NULLreturn

確定單層遞歸的邏輯:前序遍歷是中左右的循序,所以在單層遞歸的邏輯,是要先取中節點的數值,代碼如下:

  1. vec.push_back(cur->val);    // 中 
  2. traversal(cur->left, vec);  // 左 
  3. traversal(cur->right, vec); // 右 

單層遞歸的邏輯就是按照中左右的順序來處理的,這樣二叉樹的前序遍歷,基本就寫完了,在看一下完整代碼:

前序遍歷:

  1. class Solution { 
  2. public
  3.     void traversal(TreeNode* cur, vector<int>& vec) { 
  4.         if (cur == NULLreturn
  5.         vec.push_back(cur->val);    // 中 
  6.         traversal(cur->left, vec);  // 左 
  7.         traversal(cur->right, vec); // 右 
  8.     } 
  9.     vector<int> preorderTraversal(TreeNode* root) { 
  10.         vector<int> result; 
  11.         traversal(root, result); 
  12.         return result; 
  13.     } 
  14. }; 

那么前序遍歷寫出來之后,中序和后序遍歷就不難理解了,代碼如下:

中序遍歷:

  1. void traversal(TreeNode* cur, vector<int>& vec) { 
  2.     if (cur == NULLreturn
  3.     traversal(cur->left, vec);  // 左 
  4.     vec.push_back(cur->val);    // 中 
  5.     traversal(cur->right, vec); // 右 

后序遍歷:

  1. void traversal(TreeNode* cur, vector<int>& vec) { 
  2.     if (cur == NULLreturn
  3.     traversal(cur->left, vec);  // 左 
  4.     traversal(cur->right, vec); // 右 
  5.     vec.push_back(cur->val);    // 中 

此時大家可以做一做leetcode上三道題目,分別是:

  • 144.二叉樹的前序遍歷
  • 145.二叉樹的后序遍歷
  • 94.二叉樹的中序遍歷

可能有同學感覺前后中序遍歷的遞歸太簡單了,要打迭代法(非遞歸),別急,我們明天打迭代法,打個通透!

其他語言版本

Java:

  1. // 前序遍歷·遞歸·LC144_二叉樹的前序遍歷 
  2. class Solution { 
  3.     ArrayList<Integer> preOrderReverse(TreeNode root) { 
  4.         ArrayList<Integer> result = new ArrayList<Integer>(); 
  5.         preOrder(root, result); 
  6.         return result; 
  7.     } 
  8.  
  9.     void preOrder(TreeNode root, ArrayList<Integer> result) { 
  10.         if (root == null) { 
  11.             return
  12.         } 
  13.         result.add(root.val);           // 注意這一句 
  14.         preOrder(root.left, result); 
  15.         preOrder(root.right, result); 
  16.     } 
  17. // 中序遍歷·遞歸·LC94_二叉樹的中序遍歷 
  18. class Solution { 
  19.     public List<Integer> inorderTraversal(TreeNode root) { 
  20.         List<Integer> res = new ArrayList<>(); 
  21.         inorder(root, res); 
  22.         return res; 
  23.     } 
  24.  
  25.     void inorder(TreeNode root, List<Integer> list) { 
  26.         if (root == null) { 
  27.             return
  28.         } 
  29.         inorder(root.left, list); 
  30.         list.add(root.val);             // 注意這一句 
  31.         inorder(root.right, list); 
  32.     } 
  33. // 后序遍歷·遞歸·LC145_二叉樹的后序遍歷 
  34. class Solution { 
  35.     public List<Integer> postorderTraversal(TreeNode root) { 
  36.         List<Integer> res = new ArrayList<>(); 
  37.         postorder(root, res); 
  38.         return res; 
  39.     } 
  40.  
  41.     void postorder(TreeNode root, List<Integer> list) { 
  42.         if (root == null) { 
  43.             return
  44.         } 
  45.         postorder(root.left, list); 
  46.         postorder(root.right, list); 
  47.         list.add(root.val);             // 注意這一句 
  48.     } 

Python:

  1. # 前序遍歷-遞歸-LC144_二叉樹的前序遍歷 
  2. class Solution: 
  3.     def preorderTraversal(self, root: TreeNode) -> List[int]: 
  4.         # 保存結果 
  5.         result = [] 
  6.          
  7.         def traversal(root: TreeNode): 
  8.             if root == None: 
  9.                 return 
  10.             result.append(root.val) # 前序 
  11.             traversal(root.left)    # 左 
  12.             traversal(root.right)   # 右 
  13.  
  14.         traversal(root) 
  15.         return result 
  16.  
  17. # 中序遍歷-遞歸-LC94_二叉樹的中序遍歷 
  18. class Solution: 
  19.     def inorderTraversal(self, root: TreeNode) -> List[int]: 
  20.         result = [] 
  21.  
  22.         def traversal(root: TreeNode): 
  23.             if root == None: 
  24.                 return 
  25.             traversal(root.left)    # 左 
  26.             result.append(root.val) # 中序 
  27.             traversal(root.right)   # 右 
  28.  
  29.         traversal(root) 
  30.         return result 
  31.  
  32. # 后序遍歷-遞歸-LC145_二叉樹的后序遍歷 
  33. class Solution: 
  34.     def postorderTraversal(self, root: TreeNode) -> List[int]: 
  35.         result = [] 
  36.  
  37.         def traversal(root: TreeNode): 
  38.             if root == None: 
  39.                 return 
  40.             traversal(root.left)    # 左 
  41.             traversal(root.right)   # 右 
  42.             result.append(root.val) # 后序 
  43.  
  44.         traversal(root) 
  45.         return result 

 【編輯推薦】

 

責任編輯:姜華 來源: 代碼隨想錄
相關推薦

2018-03-19 14:43:28

2021-09-15 07:40:50

二叉樹數據結構算法

2020-04-27 07:05:58

二叉樹左子樹右子樹

2022-10-26 23:58:02

二叉樹數組算法

2021-04-20 08:37:14

數據結構二叉樹

2021-07-16 08:57:31

迭代遍歷二叉樹

2023-05-08 15:57:16

二叉樹數據結構

2021-09-15 07:56:32

二叉樹層次遍歷

2025-05-16 09:34:10

2021-01-13 10:03:36

二叉樹層序遍歷層次遍歷

2017-10-24 14:57:58

AI人工智能機器學習

2021-07-01 09:00:00

安全數字化轉型滲透

2018-04-26 16:15:02

數據庫MySQLMySQL 8.0

2024-07-02 11:16:21

2021-04-19 07:47:42

數據結構二叉樹Tree

2009-08-11 13:29:57

C#二叉樹遍歷

2021-08-06 11:34:05

二叉樹遞歸回溯

2024-01-23 12:54:00

C++編程語言代碼

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久最新 | 日韩欧美在线观看视频 | 毛片一区二区三区 | 一区二区三区不卡视频 | 99re在线| 精品久久久av | 国产精品美女久久久久 | 麻豆精品久久久 | 亚洲国产成人精品久久 | 亚洲成人午夜电影 | 日本免费一区二区三区四区 | 一级毛片在线看 | 在线日韩精品视频 | 高清一区二区三区 | 日本久久一区 | 精品国产91亚洲一区二区三区www | 国产高清性xxxxxxxx | 国产激情91久久精品导航 | 国产成人在线视频播放 | 美美女高清毛片视频免费观看 | 夜夜草| 日韩视频免费看 | 国产精品jizz在线观看老狼 | 91在线免费视频 | 久久久久久黄 | 四虎在线观看 | 国产亚洲区 | 青青久视频 | 精品国产网 | 搞av.com| 一级欧美一级日韩片 | 久久黄色精品视频 | 久久久久久国产精品免费免费 | 一区二区三区在线播放 | av国产精品 | 精品国产伦一区二区三区观看说明 | 欧美一区二区三区国产精品 | 精品国产乱码久久久久久牛牛 | 欧美精品欧美精品系列 | 精品欧美一区二区三区免费观看 | 91精品国产91久久久久游泳池 |