二叉树遍历的递归与非递归实现(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. 返回此过程直到栈为空为止

 

好了,以上就是中序遍历的递归与非递归两种方式的实现方法了。如有错误还望指正,谢谢。

 

posted @ 2020-03-05 15:44  maoqifan  阅读(1614)  评论(0编辑  收藏  举报