当前位置:   article > 正文

二叉树前中后遍历的非递归及递归算法、层序遍历_第3关:二叉树前序遍历递归和非递归算法

第3关:二叉树前序遍历递归和非递归算法

一、直观表现

 

以上述中,前中后序遍历顺序如下:

前序遍历(中左右):5 4 1 2 6 7 8
中序遍历(左中右):1 4 2 5 7 6 8
后序遍历(左右中):1 2 4 7 8 6 5

二、递归算法

在说二叉树的递归算法前,我们先了解下什么是递归算法

2.1 核心思想

递归算法!既要有递去的过程,也需要有归来的过程。主要总结如下三步

1.确定终止条件:

2.确定终止条件时的递归函数的参数和返回值:

3.提取重复逻辑,化大为小

2.2 递归的编程模型

  1. 模型一: 在递去的过程中解决问题
  2. function recursion(大规模){
  3. if (end_condition){ // 明确的递归终止条件
  4. end; // 简单情景
  5. }else{ // 在将问题转换为子问题的每一步,解决该步中剩余部分的问题
  6. solve; // 递去
  7. recursion(小规模); // 递到最深处后,不断地归来
  8. }
  9. }
  10. 模型二: 在归来的过程中解决问题
  11. function recursion(大规模){
  12. if (end_condition){ // 明确的递归终止条件
  13. end; // 简单情景
  14. }else{ // 先将问题全部描述展开,再由尽头“返回”依次解决每步中剩余部分的问题
  15. recursion(小规模); // 递去
  16. solve; // 归来
  17. }
  18. }

2.3 二叉树的遍历

2.3.1 前序遍历

  1. public static void preOrderRecur(TreeNode head) {
  2. if (head == null) {//2.确定
  3. return;//1.确定函数的返回值
  4. }
  5. //3.递归的真正处理逻辑
  6. //3.1 先中
  7. System.out.print(head.value + " ");
  8. //3.2 再左
  9. preOrderRecur(head.left);
  10. //3.2 再右
  11. preOrderRecur(head.right);
  12. }

2.3.2 中序遍历 

  1. public static void preOrderRecur(TreeNode head) {
  2. if (head == null) {
  3. return;
  4. }
  5. preOrderRecur(head.left);
  6. System.out.print(head.value + " ");
  7. preOrderRecur(head.right);
  8. }

2.3.3 后序遍历

  1. public static void postOrderRecur(TreeNode head) {
  2. if (head == null) {
  3. return;
  4. }
  5. postOrderRecur(head.left);
  6. postOrderRecur(head.right);
  7. System.out.print(head.value + " ");
  8. }

三、迭代算法

问题的递归实现转换成非递归实现一般需要两步工作:

   (1). 自己建立“堆栈(一些局部变量)”来保存这些内容以便代替系统栈,比如树的三种非递归遍历方式;

   (2). 把对递归的调用转变为对循环处理。

3.1 前序遍历的迭代算法

思想:按照先处理中间节点、再使用栈的数据结构,按右节点、左节点入栈

步骤操作
1打印节点5节点6、节点4
2打印节点4节点6、节点2、节点1
3打印节点1节点6、节点2
4打印节点2节点6
5打印节点6节点8、节点7
6打印节点7节点8
7打印节点8null
  1. public static void preOrderIteration(TreeNode head) {
  2. if (head == null) {
  3. return;
  4. }
  5. Stack<TreeNode> stack = new Stack<>();
  6. stack.push(head);
  7. while (!stack.isEmpty()) {
  8. TreeNode node = stack.pop();
  9. System.out.print(node.value + " ");
  10. if (node.right != null) {
  11. stack.push(node.right);
  12. }
  13. if (node.left != null) {
  14. stack.push(node.left);
  15. }
  16. }
  17. }

四、层序遍历

题目:

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回:

[3,9,20,15,7]

 解题思路,层序遍历时需要一个容器,队列(先进先出)

步骤操作
1打印节点3节点9、节点20
2打印节点9节点20
3打印节点20节点15、节点7
4打印节点15节点7
5打印节点7null

代码思路

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public int[] levelOrder(TreeNode root) {
  12. if(root == null) return new int[0];
  13. int[] res;
  14. List<Integer> list = new ArrayList<>();
  15. Queue<TreeNode> queue = new LinkedList<>();
  16. queue.add(root);
  17. while(!queue.isEmpty()){
  18. TreeNode node = queue.poll();
  19. list.add(node.val);//打印节点
  20. if(node.left != null)
  21. queue.add(node.left);//左子树入队
  22. if(node.right != null)
  23. queue.add(node.right);右子树入队
  24. }
  25. Integer[] arr = list.toArray(new Integer[list.size()]);
  26. res = new int[arr.length];
  27. for(int i = 0; i < arr.length; i ++)
  28. res[i] = arr[i];
  29. return res;
  30. }
  31. }

题目2: 

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:


输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:

输入:root = [1]
输出:[[1]]
示例 3:

输入:root = []
输出:[]

  1. class Solution {
  2. public List<List<Integer>> levelOrder(TreeNode root) {
  3. List<List<Integer>> ret = new ArrayList<List<Integer>>();//定义外层
  4. if (root == null) {
  5. return ret;
  6. }
  7. Queue<TreeNode> queue = new LinkedList<TreeNode>();
  8. queue.offer(root);
  9. while (!queue.isEmpty()) {
  10. List<Integer> level = new ArrayList<Integer>();//定义内层
  11. int currentLevelSize = queue.size();
  12. for (int i = 1; i <= currentLevelSize; ++i) {
  13. TreeNode node = queue.poll();
  14. level.add(node.val);
  15. if (node.left != null) {
  16. queue.offer(node.left);
  17. }
  18. if (node.right != null) {
  19. queue.offer(node.right);
  20. }
  21. }
  22. ret.add(level);
  23. }
  24. return ret;
  25. }
  26. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/625889
推荐阅读
相关标签
  

闽ICP备14008679号