前面提到树的3中遍历迭代实现的时候,讲到:还有一种思路,直接针对递归的实现方式,想办法通过栈来实现递归,得到的还是和上面一样

一般的递归改成迭代的方法,你需要知道迭代指针是如何走的,还要借助数据结构才能实现,就是你需要注意那些需要先放入数据结构,哪些需要后放入

下面介绍的方法是一种通用方法

以先根遍历为例:

def preorder(root):if not root:returnelse:print(root.data,end=' ')preorder(root.left)preorder(root.right)# -*- coding: utf-8 -*-class BinTNode:def __init__(self,data=None,left =None,right =None):self.data =dataself.left =leftself.right =rightclass guide:def __init__(self,operation =None,node =None,level =None):self.operation = operationself.node =node# 针对专门的问题可以专门设计需要的恢复的现场self.level =leveldef preorder(root):# operation = 1 代表处理访问自己,operation = 0访问子树stack = []result =[]# 初始化# 原始问题:访问自己,访问左子树,访问右子树# 入栈顺序:访问右子树,访问左子树,访问自己stack.append(guide(0,root))# 这里把原问题看成一个对象,这个对象有三个部分:左子树,当前结点,右子树,# 这个对象可以有两种操作,一是处理当前结点,二是访问子树,访问子树可以看成子问题while stack:Current = stack.pop()if Current.operation == 1:result.append(Current.node.data)# 为1代表访问子树,访问子树就当作子问题处理else:# 入栈顺序:访问右子树,访问左子树,访问自己if Current.node.right:stack.append(guide(0,Current.node.right))if Current.node.left:stack.append(guide(0,Current.node.left))if Current.node:stack.append(guide(1,Current.node))return resultdef inorder(root):# operation = 1 代表处理访问自己,operation = 0访问子树stack = []result =[]# 初始化# 原始问题:访问自己,访问左子树,访问右子树# 入栈顺序:访问右子树,访问左子树,访问自己stack.append(guide(0,root))# 这里把原问题看成一个对象,这个对象有三个部分:左子树,当前结点,右子树,# 这个对象可以有两种操作,一是处理当前结点,二是访问子树,访问子树可以看成子问题while stack:Current = stack.pop()if Current.operation == 1:result.append(Current.node.data)# 为1代表访问子树,访问子树就当作子问题处理else:# 入栈顺序:访问右子树,访问自己,访问左子树if Current.node.right:stack.append(guide(0,Current.node.right))if Current.node:stack.append(guide(1,Current.node))if Current.node.left:stack.append(guide(0,Current.node.left))return resultdef postorder(root):# operation = 1 代表处理访问自己,operation = 0访问子树stack = []result =[]# 初始化# 原始问题:访问自己,访问左子树,访问右子树# 入栈顺序:访问右子树,访问左子树,访问自己stack.append(guide(0,root))# 这里把原问题看成一个对象,这个对象有三个部分:左子树,当前结点,右子树,# 这个对象可以有两种操作,一是处理当前结点,二是访问子树,访问子树可以看成子问题while stack:Current = stack.pop()if Current.operation == 1:result.append(Current.node.data)# 为1代表访问子树,访问子树就当作子问题处理else:# 入栈顺序:访问自己,访问右子树,访问左子树,if Current.node:stack.append(guide(1,Current.node))if Current.node.right:stack.append(guide(0,Current.node.right))if Current.node.left:stack.append(guide(0,Current.node.left))return resultdef countTree(root):stack = []result = 0# 初始化树,把树看成待访问的一颗子树  stack = [guide(0,root),]while stack:pointer = stack.pop()if pointer.operation == 1:result +=1else:if pointer.node:stack.append(guide(1,pointer.node))if pointer.node.right:stack.append(guide(0,pointer.node.right))if pointer.node.left:stack.append(guide(0,pointer.node.left))            return resultdef sumTree(root):stack = []result = 0# 初始化树,把树看成待访问的一颗子树  stack = [guide(0,root),]while stack:pointer = stack.pop()if pointer.operation == 1:result +=pointer.node.dataelse:if pointer.node:stack.append(guide(1,pointer.node))if pointer.node.right:stack.append(guide(0,pointer.node.right))if pointer.node.left:stack.append(guide(0,pointer.node.left))            return result    def heightTree(root):stack = []MAX = 0# 初始化树,把树看成待访问的一颗子树  stack = [guide(0,root,0)]while stack:pointer = stack.pop()if pointer.operation == 1:if not pointer.node.left and not pointer.node.left:if pointer.level > MAX:MAX = pointer.levelelse:if pointer.node:stack.append(guide(1,pointer.node,pointer.level))if pointer.node.right:stack.append(guide(0,pointer.node.right,pointer.level+1))if pointer.node.left:stack.append(guide(0,pointer.node.left,pointer.level+1))            return MAX + 1 root = BinTNode(1,BinTNode(2,BinTNode(4),BinTNode(5)),BinTNode(3,BinTNode(6),BinTNode(7)))print('preorder:',end='')
print(preorder(root))
print(end='\n')
print('inorder:',end='')
print(inorder(root))
print(end='\n')
print('postorder:',end='')
print(postorder(root))
print(end='\n')
print('countTree:',end='')
print(countTree(root))
print(end='\n')
print('sumTree:',end='')
print(sumTree(root))
print(end='\n')
print('heightTree:',end='')
print(heightTree(root))
print(end='\n')                          runfile('D:/share/test/recursion_iteration_frame.py', wdir='D:/share/test')
preorder:[1, 2, 4, 5, 3, 6, 7]inorder:[4, 2, 5, 1, 6, 3, 7]postorder:[4, 5, 2, 6, 7, 3, 1]countTree:7sumTree:28heightTree:3

树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现相关推荐

  1. el-tree 扁平数据 树形结构递归处理

    树形结构递归处理函数 // 封装递归方法 export function tranListToTreeDate(list, currentId) {// 创建一个数组存放结果const res = [ ...

  2. 树形结构递归_递归和匿名函数

    戳上面的蓝字关注我,有干货哦! ❝ 编程语言中,函数Func(Type a,--)直接或间接调用函数本身,则该函数称为递归函数. ❞ 模拟实现树形结构的遍历 比如:我要遍历下图sublime_pyth ...

  3. 树形结构递归初始化(父节点,统计字段等)

    文章目录 1.核心思想: 2.核心方法实现: 3.完整代码如下 3.1. 树形实体 3.2. 完整操作 1.核心思想: 1.先将每个节点按层级进行分组成map,并记录最大层级: 2.层级自下而上的递归 ...

  4. php树形结构数组转化

    /*** @param array $list 要转换的结果集* @param string $pid parent标记字段* @param string $level level标记字段*/ fun ...

  5. 树形结构数据封装(及拉平)的几种方法

    java(for循环处理.递归处理.map处理) public class DemoApplicationTests {/*for循环写法*//*** @param args*/public stat ...

  6. 树形结构:从二分查找,二叉搜索树寻找最近祖先,从递归到迭代,实现技巧总结

    二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术. 深究其原因是,这一类型的递 ...

  7. 树形结构:二叉排列树,二叉搜索树

    二叉排列树,二叉搜索树 这个数听见得比较多,含义是:左边<=中间<=右边,换句话来说使用中序遍历最后得到结果就是一个有序得序列. 建立一颗二叉排列树 class BinTNode:def ...

  8. 回溯法之递归回溯和迭代回溯

      回溯法有通用解题法之称,它可以系统的搜索一个问题的所有解或者任意解.它在问题的解空间树中,按深度优先策略从根节点出发搜索解空间树,算法搜索至解空间树的任意一个结点时,先判断该节点如(子树)是否包含 ...

  9. 数据结构学习——树形结构之递归遍历二叉树

    目录 一. 什么是二叉树 二. 二叉树分类 2.1.完全二叉树 2.2.满二叉树 2.3.扩充二叉树 2.4.平衡二叉树 三. 二叉树的应用场景 四. 遍历方式 五. 为什么要研究遍历 六. 前序遍历 ...

最新文章

  1. Swift_类型选择
  2. 雷林鹏分享:PHP 5 时区
  3. Hash查找的基本原理及实现
  4. 毕业10年,我有话说
  5. bccomp在php中什么意思,PHP bccomp()用法及代码示例
  6. java多线程总结二:后台线程(守护线程)
  7. halcon append_ocr_trainf 将字符添加到训练文件中
  8. MySQL purge 线程
  9. php ie 下载 乱码,php ie下载文件名乱码怎么办
  10. CentOS 6.9/7通过yum安装指定版本的Redis
  11. 深入HBase架构解析(二)【转】
  12. matlab将图片旋转的代码_【MATLAB】钟表
  13. mybatis映射多对多查询实现
  14. eclipse jar打包 jar line too long 异常处理方法
  15. python之修改pip为阿里源
  16. AlphaGo围棋 论文笔记
  17. Java 算法刷题指南
  18. 中英文字体对照 ueditor添加字体
  19. 计算机附件常用工具,Windows附件常用工具
  20. 版本控制工具 Git 和SVN 的区别

热门文章

  1. mysql innodb_undo_directory默认_MySQL innodb_undo_tablespaces相关参数
  2. Failed to read auto-increment value from storageengine错误的处理方法
  3. Windows下适用于PHP 7.1的memcache扩展工具编译
  4. linux lnmp分布式集群,LNMP 分布式集群(六):keepalived 高可用方案
  5. 【linux】查看内存使用情况
  6. 【CKEditor】上传图片接口接收不到CKEditorFuncNum参数
  7. mysql bench建立一张表_使用MySQL Workbench建立数据库,建立新的表,向表中添加数据...
  8. python集合例题_python练习题集合-2
  9. html div 自动聚焦,让DIV也能够获取焦点
  10. php建站静态,php网站如何生成静态