二叉树遍历几种常见方式
2017-08-16 23:00
441 查看
前序遍历
递归版本
非递归版本
中序遍历
递归版本
非递归版本
后序遍历
递归版本
非递归版本
访问根结点;
先序遍历根结点的左子树;
先序遍历根结点的右子树。
代码实现如下:
中序遍历根结点的左子树;
访问根结点;
中序遍历根结点的右子树。
后序遍历根结点的左子树;
后序遍历根结点的右子树。
访问根结点;
递归版本
非递归版本
中序遍历
递归版本
非递归版本
后序遍历
递归版本
非递归版本
前序遍历
递归版本
先序遍历的递归过程为:若二叉树为空,遍历结束。否则,访问根结点;
先序遍历根结点的左子树;
先序遍历根结点的右子树。
代码实现如下:
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; }
相关文章推荐
- 二叉树的几种遍历方式浅析:递归遍历/堆栈遍历/层序遍历/Morris遍历
- Objective-C中遍历字典、数组和集合的几种常见方式
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 二叉树的常见方法及三种遍历方式 Java 实现
- 二叉树的遍历有几种方式?
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 二叉树几种遍历方式
- java中遍历Map的几种常见方式
- 二叉树的几种遍历方式
- 二叉树的几种遍历方式
- 二叉树的几种遍历方式浅析:递归遍历/堆栈遍历/层序遍历/Morris遍历
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 二叉树的常见方法及三种遍历方式 Java 实现
- 二叉树的常见方法及三种遍历方式 Java 实现
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 非递归方式遍历二叉树的几种方法
- 常见集合的几种遍历方式
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)