二叉树遍历几种常见方式
来源:互联网 发布:mac的usb配件已停用 编辑:程序博客网 时间:2024/06/03 16:40
- 前序遍历
- 递归版本
- 非递归版本
- 中序遍历
- 递归版本
- 非递归版本
- 后序遍历
- 递归版本
- 非递归版本
前序遍历
递归版本
先序遍历的递归过程为:若二叉树为空,遍历结束。否则,
- 访问根结点;
- 先序遍历根结点的左子树;
- 先序遍历根结点的右子树。
代码实现如下:
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new LinkedList<Integer>(); preHelper(root,res); return res; }public void preHelper(TreeNode root, List<Integer> res) { if (root == null) return; res.add(root.val); preHelper(root.left, res); preHelper(root.right, res);}
非递归版本
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); Deque<TreeNode> stack = new ArrayDeque<>(); TreeNode p = root; while (!stack.isEmpty() || p != null) { if (p != null) { stack.push(p); result.add(p.val); // 在遍历到左孩子之前添加 p = p.left; } else { TreeNode node = stack.pop(); p = node.right; } } return result;}
中序遍历
递归版本
中序遍历的递归过程为:若二叉树为空,遍历结束。否则,
- 中序遍历根结点的左子树;
- 访问根结点;
- 中序遍历根结点的右子树。
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if (root == null) return res; help(root, res); return res;}private void help(TreeNode root, List<Integer> res) { if (root == null) return; help(root.left, res); res.add(root.val); help(root.right, res);}
非递归版本
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); Deque<TreeNode> stack = new ArrayDeque<>(); TreeNode p = root; while(!stack.isEmpty() || p != null) { if(p != null) { stack.push(p); p = p.left; } else { TreeNode node = stack.pop(); result.add(node.val); p = node.right; } } return result;}
后序遍历
递归版本
后序遍历的递归过程为:若二叉树为空,遍历结束。否则,
- 后序遍历根结点的左子树;
- 后序遍历根结点的右子树。
- 访问根结点;
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if (root == null) return res; help(root, res); return res;}private void help(TreeNode root, List<Integer> res) { if (root == null) return; help(root.left, res); help(root.right, res); res.add(root.val);}
非递归版本
public List<Integer> postorderTraversal(TreeNode root) { LinkedList<Integer> result = new LinkedList<>(); Deque<TreeNode> stack = new ArrayDeque<>(); TreeNode p = root; while(!stack.isEmpty() || p != null) { if(p != null) { stack.push(p); result.addFirst(p.val); p = p.right; } else { TreeNode node = stack.pop(); p = node.left; } } return result;}
阅读全文
1 0
- 二叉树遍历几种常见方式
- 二叉树的几种遍历方式
- 二叉树的几种遍历方式
- 非递归方式遍历二叉树的几种方法
- Leetcode036--二叉树遍历的几种方式
- 常见集合的几种遍历方式
- 二叉树的几种遍历方式浅析:递归遍历/堆栈遍历/层序遍历/Morris遍历
- 二叉树的几种遍历方式浅析:递归遍历/堆栈遍历/层序遍历/Morris遍历
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 两种常见的方式实现二叉树的中序遍历
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 二叉树的几种遍历
- 二叉树的几种遍历方法
- 二叉树的几种遍历方法
- 二叉树遍历方式
- 二叉树遍历方式
- Python3学习笔记(5)——函数和函数式编程
- spring websocket性能测试
- 生成一个指定长度的随机字符串
- JavaScript之Math对象详解
- 面试题10 :二进制中1的个数
- 二叉树遍历几种常见方式
- 一个简易的51单片机串口接收和发送程序
- Python3学习笔记(6)——模块与包
- Java数据结构05----栈:顺序栈和链式堆栈
- windows下配置mygsl数值计算c程序库的方法
- RabbitMQ消息队列(三):任务分发机制
- 多校7 HDU
- 数组元素的最大差值
- word-break