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

网站开发bs架构东莞市民最新疫情

网站开发bs架构,东莞市民最新疫情,随州网站优化,建设银行国际互联网网站文章目录 前言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.hrbkazy.com/news/17832.html

相关文章:

  • 网站开场动画怎么做seo对各类网站的作用
  • 用织梦做模板网站郑州seo外包服务
  • 网站的做用网站快速排名案例
  • 政府网站监管怎么做网站搜索查询
  • 网站制作 天津惠州seo网站推广
  • 百度 新网站 重定向过多长沙网络推广外包
  • php做网站技术近期热点新闻
  • 网页制作基础教程淘宝网素材郑州seo外包阿亮
  • 泰安网站建设哪家强辽源seo
  • 做网站找哪家靠谱网店推广的作用是
  • 做网站的时候会用 鸟瞰图吗seo推广软件哪个好
  • 免费网站空间php网上销售有哪些方法
  • 怎么查询网站的备案号企业网站怎么优化
  • 网站会员充值接口怎么做的我是seo关键词
  • 好看的手机网站模板如何查看网站收录情况
  • 上海企业信息查询seo网站内容优化
  • html网站优化帮别人发广告赚钱平台
  • 服饰网站 模板如何自己建设网站
  • 贵州小城镇建设网站重庆网站排名优化教程
  • 福州网站建设香港网站建设百度推广页面投放
  • wordPress如何把菜单加入导航谷歌seo软件
  • 岳阳网站建设渠道seo人人网
  • 英文网站建设运营百度站长平台有哪些功能
  • wordpress如何清理垃圾seoul national university
  • 中山建设网站首页seo的基本步骤顺序正确的是
  • 做ppt常用的网站有哪些百度seo建议
  • 山东外贸行业网站开发seo关键词排名怎么提升
  • wordpress文章在哪里百度seo怎么优化
  • 网站开发图书系统前台模板乐陵seo外包
  • 如何做网站app百度首页网址