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

算法通关村第七关—迭代实现二叉树的遍历(黄金)

       迭代实现二叉树的遍历

迭代法实现前序遍历

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

public List<Integer>preorderTraversal(TreeNode root){
List<Integer>res = new ArrayList<Integer>();
if(root == null){return res;
}
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.left;}node = stack.pop();node = node.right;
}
return res;
}

迭代法实现中序遍历

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

public List<Integer>inorderTraversal(TreeNode root){
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stack = new LinkedList<TreeNode>();
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;
}

迭代法实现后序遍历

 后序遍历的非递归实现有三种基本的思路:反转法、访问标记法、和Mos法,可惜,三种理解起来都有些难度。
 访问标记法是最难理解的方法,而Mos法是一个老外发明的巧妙思想:不使用栈,而是用好树中的null指针,但是实现后序仍然非常麻烦,我们这里不再展开,感兴趣的同学可以查一下,
 这里分享一种好理解又好实现的方法:反转法。如下图,我们先观察后序遍历的结果是seq={95743},如果我们将其整体反转的话就是new_seq={34759}。
截屏2023-12-03 15.38.58.png
 得到new_seql的方法和前序遍历思路几乎一致,只不过是左右反了。前序是先中间,再左边然后右边,而这里是先中间,再后边然后左边。那我们完全可以改造一下前序遍历,得到序列new_seq之后再reverse一下就是想要的结果了,代码如下:

public List<Integer>postorderTraversal(TreeNode root){
List<Integer>res = new ArrayList<>();
if (root == null)return res;
Stack<TreeNode>stack = new stack<>();
TreeNode node = root;
while(!stack.isEmpty() || node != null){while(node != null){res.add(node.val);stack.push(node);node = node.right; //是right不是left}node stack.pop();node node.left;
}
//注意反转要用Collections
Collections.reverse(res);
return res;
}
http://www.lryc.cn/news/256424.html

相关文章:

  • Java期末复习题之封装
  • 湖科大计网:计算机网络概述
  • 每日一道c语言
  • (C)一些题11
  • 多级路由component页面不加载
  • 【原创】Mac mini M1安装home-brew
  • 【python交互界面】实现动态观察图像在给定HSV范围的区域显示
  • Vue3中定义变量是选择ref还是reactive?
  • 数据结构 | 查漏补缺之哈希表、最短路径、二叉树与森林的转换
  • SpringCloud
  • fastadmin嵌套关联查询,thinkPHP5嵌套关联查询
  • Power BI - 5分钟学习拆分列
  • ELK(四)—els基本操作
  • 【100天精通Python】Day75:Python机器学习-第一个机器学习小项目_鸾尾花分类项目(上)
  • gitlab高级功能之容器镜像仓库
  • 线程的使用(二)
  • k8s之镜像拉取时使用secret
  • mysql面试题——MVCC
  • 【华为数据之道学习笔记】1-2华为数字化转型与数据治理
  • 微服务01
  • 作业12.8
  • 已解决error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘
  • Android View.inflate 和 LayoutInflater.from(this).inflate 的区别
  • etcd 与 Consul 的一致性读对比
  • Docker 安装Apache Superset 并实现汉化和快速入门
  • 差异计算基础知识 - 了解期末业务操作、WIP 和差异
  • spring boot定时器实现定时同步数据
  • 第一百九十六回 通过蓝牙发送数据的细节
  • 26.Python 网络爬虫
  • Spring Boot 在启动之前还做了哪些准备工作?