最近在刷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. 返回此過程直到棧為空為止
好了,以上就是中序遍歷的遞歸與非遞歸兩種方式的實現方法了。如有錯誤還望指正,謝謝。