二叉树遍历的递归与非递归实现(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. 返回此过程直到栈为空为止
好了,以上就是中序遍历的递归与非递归两种方式的实现方法了。如有错误还望指正,谢谢。