当前位置: 首页 > news >正文

网站建设与规划前景沧州做网络推广的平台

网站建设与规划前景,沧州做网络推广的平台,在东莞做,c 怎么和网站做交互文章目录 前言1. 迭代法实现前序遍历2. 迭代法实现中序遍历3. 迭代法实现后序遍历总结 前言 提示:在一个信息爆炸却多半无用的世界,清晰的见解就成了一种力量。 --尤瓦尔赫拉利《今日简史》 你是不是觉得上一关特别简单,代码少,背…

文章目录

  • 前言
  • 1. 迭代法实现前序遍历
  • 2. 迭代法实现中序遍历
  • 3. 迭代法实现后序遍历
  • 总结


前言


提示:在一个信息爆炸却多半无用的世界,清晰的见解就成了一种力量。 --尤瓦尔·赫拉利《今日简史》

你是不是觉得上一关特别简单,代码少,背下来就行了,但是如果你要真的理解透了,尝试一下这个一关的练习,用迭代的方式在展示一下,我们就看看非递归方式实现过程。

当然在面试的时候,如果你靠二叉树的前中后序遍历,面试官很可能不让你使用递归方式,因为太简单,可能会点名要你采用迭代的方式,所以这种方式也是必要掌握的。

理论上,递归可以解决的事情都可以通过迭代的方式解决,但是会很复杂,上面的几个递归遍历方法,背下来但是面试的时候不要求使用你就很难受的。

递归就是每次执行方法调用都会先把当前的局部变量、参数值和返回地址等压入栈中,后面再递归返回的时候,从栈顶弹出上一层的各项参数继续执行,这就是递归为什么自动返回并执行上一层方法的原因。我们这里采用迭代方法练习这三道题:

推荐题目⭐⭐⭐⭐:

144. 二叉树的前序遍历 - 力扣(LeetCode)

94. 二叉树的中序遍历 - 力扣(LeetCode)

145. 二叉树的后序遍历 - 力扣(LeetCode)

1. 迭代法实现前序遍历

前序遍历是中左右,如果还有子树就是一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出代码,但是要主以空节点不如栈。

/*** 二叉树的前序遍历* @param root* @return*/public static List<Integer> preOrderTraversal(TreeNode root) {// 校验参数if (root == null){return new ArrayList<Integer>();}// 创建空间List<Integer> res = new ArrayList<Integer>();Deque<TreeNode> stack = new LinkedList<>();// 保留根节点TreeNode node = root;// 只要根节点不空或者栈不空 就循环遍历while(!stack.isEmpty() || node != null){// 中左右while(node != null){res.add(node.val);stack.push(node);node = node.left;}node = stack.pop();node = node.right;}return res;}

2. 迭代法实现中序遍历

再来看看中序遍历,中序遍历时左中右,先访问的时二叉树的左子树,然后再一层一层向下访问,知道达到树的最左底部,在处理节点(也就是把节点数值放入res列表)。在使用迭代法写中序遍历,就需要借助指针的遍历帮助访问节点,栈则用来处理节点上的元素。

看下代码实现:

    /*** 二叉树中序遍历* @param root* @return*/public static List<Integer> inorderTraversal (TreeNode root) {// 参数检验if (root == null){return new ArrayList<Integer>();}// 创建空间List<Integer> res = new ArrayList<Integer>();// 栈存储引用Deque<TreeNode> stack = new LinkedList<>();// 根节点不为空或者栈不为空 一直向下遍历while (root != null ||!stack.isEmpty() ) {while(root != null){stack.push(root);root = root.left;}root = stack.pop();res.add(root.val);root = root.right;}return res;}

3. 迭代法实现后序遍历

后续遍历的非递归方法有三种基本实现思路

  1. 反转法
  2. 访问标记法
  3. Morris法

说是话这三种方法理解起来都有些难度,如果你想挑战一下你的头发,我觉得你可以试一试。

个人觉得访问标记法时最难理解的方法,Morris法时国外的大佬发明的巧思:不是用栈,而使用树中大量的空闲指针完成的,但是实现起来也是很麻烦。感兴趣的同学可以参考这篇文章看下:

【递归+迭代详解】二叉树的morris遍历、层序遍历、前序遍历、中序遍历、后序遍历_morris 递归_威斯布鲁克.猩猩的博客-CSDN博客

这里你们估计已经猜到我们要使用那种方法了:反转发。

我们看下图:
在这里插入图片描述
我们可以看到后序遍历的结果是seq = {9 5 7 4 3 },我们将其反转后的结果是 new_seq = {3 4 7 5 9}.

你有没有发现有什么不一样的地方,看new_seq的序列是不是和前序的思路几乎一致,只不过是左右反了,前序是先中间然后再左右,这里变成了先中间然后再右左。我们完全可以改造一下前序遍历的思路,得到序列new_seq之后,然后再将结果反转过来就是我们想要的结果了。

这真是个天才🤔:

 	/*** 反转法实现** @param root* @return*/public static List<Integer> postOrderTraversal(TreeNode root) {// 参数校验if (root == null) {return new ArrayList<Integer>();}// 创建空间List<Integer> res = new ArrayList<Integer>();Deque<TreeNode> stack = new LinkedList<TreeNode>();// 保留根节点信息TreeNode node = root;// 根节点不为空或者栈不为空,不断遍历下去while (!stack.isEmpty() || node != null) {while (node != null) {res.add(node.val);stack.push(node);node = node.right;}node = stack.pop();node = node.left;}// 重新反转分到结果集Collections.reverse(res);return res;}

这个方法可以巧妙的避开后序遍历的坑,感兴趣的同学可以从后续慢慢写,研究下他的妙处。


总结

提示:二叉树的迭代遍历;栈的思想;反转法

http://www.fp688.cn/news/162995.html

相关文章:

  • 网站的安全性建设快速网站
  • wordpress 5.3四川百度推广和seo优化
  • 义乌 外贸网站 开发贵阳做网络推广的公司
  • 去掉自豪地采用wordpress南京seo推广
  • wordpress特殊主题关键词设置seo博客写作
  • 线上名片制作杭州网站seo推广
  • 做网站用什么web服务器企业官网网站
  • 河北网站建设报价google下载安卓版下载
  • 重庆网站建设慕枫山东seo百度推广
  • dreamweaver网站建设与管理心得电商平台怎么运营的
  • 东莞专业的网站建设网络推广广告服务平台
  • 多国语言网站建设seo运营学校
  • 怎么做网站关键词优化深圳优化网站
  • 南宁市建设局网站友链交易平台源码
  • 想开民宿自己怎么做介绍的网站网站模板大全
  • 郑州北环网站建设培训郴州seo网络优化
  • 有什么学做木工的网站吗seo优化网站排名
  • 广州荔湾做网站公百度开放平台登录
  • 宫免费网站百度网盘app手机版
  • 网站模板王青岛网站建设方案
  • 网站制作公司怎样帮客户做优化优化提升
  • 东莞网站建设seo优化seo优化快排
  • 廊坊网站建设安徽seo网络优化师
  • 网站怎么做啊搜索引擎的设计与实现
  • 全椒做网站seo自学网视频教程
  • 饰品类网站建设定位免费网络营销推广软件
  • dz论坛可以做招聘网站亚马逊关键词排名提升
  • 辽宁省和城乡建设厅网站搜索引擎营销的实现方法有哪些
  • 北京最不靠谱的十大装修公司品牌网络seo方案外包
  • 用asp做网站出现空白2345网址导航