树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现
前面提到树的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
树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现相关推荐
- el-tree 扁平数据 树形结构递归处理
树形结构递归处理函数 // 封装递归方法 export function tranListToTreeDate(list, currentId) {// 创建一个数组存放结果const res = [ ...
- 树形结构递归_递归和匿名函数
戳上面的蓝字关注我,有干货哦! ❝ 编程语言中,函数Func(Type a,--)直接或间接调用函数本身,则该函数称为递归函数. ❞ 模拟实现树形结构的遍历 比如:我要遍历下图sublime_pyth ...
- 树形结构递归初始化(父节点,统计字段等)
文章目录 1.核心思想: 2.核心方法实现: 3.完整代码如下 3.1. 树形实体 3.2. 完整操作 1.核心思想: 1.先将每个节点按层级进行分组成map,并记录最大层级: 2.层级自下而上的递归 ...
- php树形结构数组转化
/*** @param array $list 要转换的结果集* @param string $pid parent标记字段* @param string $level level标记字段*/ fun ...
- 树形结构数据封装(及拉平)的几种方法
java(for循环处理.递归处理.map处理) public class DemoApplicationTests {/*for循环写法*//*** @param args*/public stat ...
- 树形结构:从二分查找,二叉搜索树寻找最近祖先,从递归到迭代,实现技巧总结
二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术. 深究其原因是,这一类型的递 ...
- 树形结构:二叉排列树,二叉搜索树
二叉排列树,二叉搜索树 这个数听见得比较多,含义是:左边<=中间<=右边,换句话来说使用中序遍历最后得到结果就是一个有序得序列. 建立一颗二叉排列树 class BinTNode:def ...
- 回溯法之递归回溯和迭代回溯
回溯法有通用解题法之称,它可以系统的搜索一个问题的所有解或者任意解.它在问题的解空间树中,按深度优先策略从根节点出发搜索解空间树,算法搜索至解空间树的任意一个结点时,先判断该节点如(子树)是否包含 ...
- 数据结构学习——树形结构之递归遍历二叉树
目录 一. 什么是二叉树 二. 二叉树分类 2.1.完全二叉树 2.2.满二叉树 2.3.扩充二叉树 2.4.平衡二叉树 三. 二叉树的应用场景 四. 遍历方式 五. 为什么要研究遍历 六. 前序遍历 ...
最新文章
- Swift_类型选择
- 雷林鹏分享:PHP 5 时区
- Hash查找的基本原理及实现
- 毕业10年,我有话说
- bccomp在php中什么意思,PHP bccomp()用法及代码示例
- java多线程总结二:后台线程(守护线程)
- halcon append_ocr_trainf 将字符添加到训练文件中
- MySQL purge 线程
- php ie 下载 乱码,php ie下载文件名乱码怎么办
- CentOS 6.9/7通过yum安装指定版本的Redis
- 深入HBase架构解析(二)【转】
- matlab将图片旋转的代码_【MATLAB】钟表
- mybatis映射多对多查询实现
- eclipse jar打包 jar line too long 异常处理方法
- python之修改pip为阿里源
- AlphaGo围棋 论文笔记
- Java 算法刷题指南
- 中英文字体对照 ueditor添加字体
- 计算机附件常用工具,Windows附件常用工具
- 版本控制工具 Git 和SVN 的区别
热门文章
- mysql innodb_undo_directory默认_MySQL innodb_undo_tablespaces相关参数
- Failed to read auto-increment value from storageengine错误的处理方法
- Windows下适用于PHP 7.1的memcache扩展工具编译
- linux lnmp分布式集群,LNMP 分布式集群(六):keepalived 高可用方案
- 【linux】查看内存使用情况
- 【CKEditor】上传图片接口接收不到CKEditorFuncNum参数
- mysql bench建立一张表_使用MySQL Workbench建立数据库,建立新的表,向表中添加数据...
- python集合例题_python练习题集合-2
- html div 自动聚焦,让DIV也能够获取焦点
- php建站静态,php网站如何生成静态