二叉樹遍歷的遞歸與非遞歸實現(python)


最近在刷leetcode時,刷到了二叉樹中序遍歷的題目,所以特在此記錄一下,下面我將給出中序遍歷的遞歸實現和非遞歸(迭代)實現的代碼與算法思想:

1. 中序遍歷的遞歸實現:

 1 class TreeNode(object):
 2     def __init__(self, x):
 3         self.val = x         # 節點存儲的值
 4         self.left = None     # 左子節點
 5         self.right = None    # 右子節點
 6 
 7 class solution:
 8     def __init__(self):
 9         self.__result_list = list()    # 存放中序遍歷結果的集合
10     def inorder_traversal(self, root : TreeNode) -> list:
11         if root == None: return               # 判斷節點是否為空
12         self.inorder_traversal(root.left)     # 遞歸遍歷左子樹
13         self.__result_list.append(root.val)   # 將節點的值存放到集合中
14         self.inorder_traversal(root.right)    # 遞歸遍歷右子樹  
15         return self.__result_list             # 返回集合   

遞歸實現的算法思想:先中序遍歷左子樹,然后訪問根節點,最后訪問右子樹。

 

2. 中序遍歷的非遞歸(迭代)實現

 1 class TreeNode(object):
 2     def __init__(self, x):
 3          self.val = x         # 節點存儲的值
 4          self.left = None     # 左子節點
 5          self.right = None    # 右子節點
 6 
 7 class solution:
 8     def inorder_traversal1(self, root : TreeNode) -> list:
 9         if root == None: return
10         stack = list()          # 存放節點的棧
11         result_list = list()    # 存放節點值的集合
12         while root != None and result_list:
13             while root != None :
14                 stack.append(root)        # 將該節點壓入棧中
15                 root = root.left          # (指針)指向左子節點
16             new_root = stack.pop()        # 彈出棧頂節點
17             result_list.append(new_root.val) # 將該節點的值加入結果集合
18             root = new_root.right         # (指針)指向被彈出節點的右子節點
19         return result_list                # 返回結果集合

迭代實現的算法思想:

1. 先將根節點壓入棧中 , 接着掃描根節點的左子節點

2. 若左子節點不為空則重復上述操作

3. 若左自節點為空則彈出棧頂節點,並掃描被彈出節點的右子節點

4. 返回此過程直到棧為空為止

 

好了,以上就是中序遍歷的遞歸與非遞歸兩種方式的實現方法了。如有錯誤還望指正,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM