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

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

  • 相关阅读:
    maven项目部署到tomcat中没有classe文件的问题汇总
    Tomcat远程调试模式及利用Eclipse远程链接调试
    FastDFS 常见问题
    Linux Crontab 定时任务 命令详解
    EChart 关于图标控件的简单实用
    java 通过zxing生成二维码
    Mybatis typeAliases别名
    Mybatis 实现手机管理系统的持久化数据访问层
    Mybatis 实现传入参数是表名
    Mybatis关于like的字符串模糊处理
  • 原文地址:https://www.cnblogs.com/maoqifansBlog/p/12420636.html
Copyright © 2011-2022 走看看