算法练习第十二天|二叉树的递归遍历和迭代遍历

二叉树的遍历方式有广度还有深度方式
深度优先遍历:先往深走,遇到叶子节点再往回走。
广度优先遍历:一层一层的去遍历。
本文写的是深度优先遍历,分为前序,中序,后序遍历。这里前中后,其实指的就是中间节点的遍历顺序

  1. 二叉树的前序遍历
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        preHandle(root,result);
        return result;
    }
    private void preHandle(TreeNode root, List<Integer> result) {
        if(root== null){
            return;
        }
        result.add(root.val);
        preHandle(root.left,result);
        preHandle(root.right,result);
    }
}
  1. 二叉树的后序遍历
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> res = new ArrayList<>();
            postorder(root, res);
            return res;
    }

    private void postorder(TreeNode root, List<Integer> list) {
            if (root == null) {
                return;
            }
            postorder(root.left, list);
            postorder(root.right, list);
            list.add(root.val);             // 注意这一句
        }
}
  1. 二叉树的中序遍历
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        //preHandle(treeNode,result);
        middleHandle(root,result);
        return result;
    }
        private void middleHandle(TreeNode root, List<Integer> result) {
        if(root== null){
            return;
        }
        middleHandle(root.left,result);
        result.add(root.val);
        middleHandle(root.right,result);
    }
}

迭代遍历
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。

// 前序遍历顺序:中-左-右,入栈顺序:中-右-左

        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            if (root == null){
                return result;
            }
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.isEmpty()){
                TreeNode node = stack.pop();
                result.add(node.val);
                if (node.right != null){
                    stack.push(node.right);
                }
                if (node.left != null){
                    stack.push(node.left);
                }
            }
            return result;
        }


    // 中序遍历顺序: 左-中-右 入栈顺序: 左-右

        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            if (root == null){
                return result;
            }
            Stack<TreeNode> stack = new Stack<>();
            TreeNode cur = root;
            while (cur != null || !stack.isEmpty()){
                if (cur != null){
                    stack.push(cur);
                    cur = cur.left;
                }else{
                    cur = stack.pop();
                    result.add(cur.val);
                    cur = cur.right;
                }
            }
            return result;
        }


    // 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果

        public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            if (root == null){
                return result;
            }
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.isEmpty()){
                TreeNode node = stack.pop();
                result.add(node.val);
                if (node.left != null){
                    stack.push(node.left);
                }
                if (node.right != null){
                    stack.push(node.right);
                }
            }
            Collections.reverse(result);
            return result;
        }

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 18:06:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 18:06:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 18:06:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 18:06:02       18 阅读

热门阅读

  1. 大数据架构

    2024-03-10 18:06:02       19 阅读
  2. typedef 别名的定义和使用

    2024-03-10 18:06:02       26 阅读
  3. springboot 下载 Excel 文件的 Controller 层案例

    2024-03-10 18:06:02       19 阅读
  4. AI辅助研发,引领科技新潮流

    2024-03-10 18:06:02       26 阅读
  5. C++核心编程

    2024-03-10 18:06:02       18 阅读
  6. 力扣背包问题

    2024-03-10 18:06:02       23 阅读
  7. 【微软技术】介绍

    2024-03-10 18:06:02       24 阅读
  8. 面试题之——SpringBoot的好处?

    2024-03-10 18:06:02       22 阅读
  9. django 的 filter 使用技巧

    2024-03-10 18:06:02       21 阅读