日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
二叉樹的遞歸遍歷,套路都在這里

二叉樹的遞歸遍歷

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

成都創(chuàng)新互聯(lián)始終致力于在企業(yè)網(wǎng)站建設(shè)領(lǐng)域發(fā)展。秉承“創(chuàng)新、求實(shí)、誠(chéng)信、拼搏”的企業(yè)精神,致力為企業(yè)提供全面的網(wǎng)絡(luò)宣傳與技術(shù)應(yīng)用整體策劃方案,為企業(yè)提供包括“網(wǎng)站建設(shè)、成都響應(yīng)式網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、微信網(wǎng)站建設(shè)、微信平臺(tái)小程序開發(fā)、商城網(wǎng)站開發(fā)、平臺(tái)網(wǎng)站建設(shè)秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

主要是對(duì)遞歸不成體系,沒有方法論,每次寫遞歸算法 ,都是靠玄學(xué)來(lái)寫代碼,代碼能不能編過都靠運(yùn)氣。

本篇將介紹前后中序的遞歸寫法,一些同學(xué)可能會(huì)感覺很簡(jiǎn)單,其實(shí)不然,我們要通過簡(jiǎn)單題目把方法論確定下來(lái),有了方法論,后面才能應(yīng)付復(fù)雜的遞歸。

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

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

確定終止條件:寫完了遞歸算法, 運(yùn)行的時(shí)候,經(jīng)常會(huì)遇到棧溢出的錯(cuò)誤,就是沒寫終止條件或者終止條件寫的不對(duì),操作系統(tǒng)也是用一個(gè)棧的結(jié)構(gòu)來(lái)保存每一層遞歸的信息,如果遞歸沒有終止,操作系統(tǒng)的內(nèi)存棧必然就會(huì)溢出。

確定單層遞歸的邏輯:確定每一層遞歸需要處理的信息。在這里也就會(huì)重復(fù)調(diào)用自己來(lái)實(shí)現(xiàn)遞歸的過程。

好了,我們確認(rèn)了遞歸的三要素,接下來(lái)就來(lái)練練手:

以下以前序遍歷為例:

確定遞歸函數(shù)的參數(shù)和返回值:因?yàn)橐蛴〕銮靶虮闅v節(jié)點(diǎn)的數(shù)值,所以參數(shù)里需要傳入vector在放節(jié)點(diǎn)的數(shù)值,除了這一點(diǎn)就不需要在處理什么數(shù)據(jù)了也不需要有返回值,所以遞歸函數(shù)返回類型就是void,代碼如下:

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

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

 
 
 
  1. if (cur == NULL) return;

確定單層遞歸的邏輯:前序遍歷是中左右的循序,所以在單層遞歸的邏輯,是要先取中節(jié)點(diǎn)的數(shù)值,代碼如下:

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

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

前序遍歷:

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

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

中序遍歷:

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

后序遍歷:

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

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

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

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

其他語(yǔ)言版本

Java:

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

Python:

 
 
 
  1. # 前序遍歷-遞歸-LC144_二叉樹的前序遍歷
  2. class Solution:
  3.     def preorderTraversal(self, root: TreeNode) -> List[int]:
  4.         # 保存結(jié)果
  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.         traversal(root)
  14.         return result
  15. # 中序遍歷-遞歸-LC94_二叉樹的中序遍歷
  16. class Solution:
  17.     def inorderTraversal(self, root: TreeNode) -> List[int]:
  18.         result = []
  19.         def traversal(root: TreeNode):
  20.             if root == None:
  21.                 return
  22.             traversal(root.left)    # 左
  23.             result.append(root.val) # 中序
  24.             traversal(root.right)   # 右
  25.         traversal(root)
  26.         return result
  27. # 后序遍歷-遞歸-LC145_二叉樹的后序遍歷
  28. class Solution:
  29.     def postorderTraversal(self, root: TreeNode) -> List[int]:
  30.         result = []
  31.         def traversal(root: TreeNode):
  32.             if root == None:
  33.                 return
  34.             traversal(root.left)    # 左
  35.             traversal(root.right)   # 右
  36.             result.append(root.val) # 后序
  37.         traversal(root)
  38.         return result

當(dāng)前題目:二叉樹的遞歸遍歷,套路都在這里
當(dāng)前鏈接:http://www.5511xx.com/article/cdohgje.html