二叉树前序、中序、后序以及层次遍历

前序遍历(中左右)

/**
 * 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> res = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        while(root != null||!deque.isEmpty()){
            while(root!=null){
                res.add(root.val);
                deque.push(root);
                root = root.left;
            }
            root = deque.pop();
            root = root.right;
        }
        return res;
    }
}
递归实现前序遍历
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        order(root,res);
        return res;
    }

    private void order(TreeNode root,List<Integer> res){
        if(root == null){
            return;
        }

        res.add(root.val);
        order(root.left,res);
        order(root.right,res);
    }
}

中序遍历(左中右)

/**
 * 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> res = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        while(root != null||!deque.isEmpty()){
            while(root!=null){
                deque.push(root);
                root = root.left;
            }
            res.add(root.val);
            root = deque.pop();
            root = root.right;
        }
        return res;
    }
}
递归实现中序遍历
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        order(root,res);
        return res;
    }

    private void order(TreeNode root,List<Integer> res){
        if(root == null){
            return;
        }
        order(root.left,res);
        res.add(root.val);
        order(root.right,res);
    }
}

后序遍历(左右中)

/**
 * 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<>();
        Deque<TreeNode> deque = new LinkedList<>();
        TreeNode prev = null;
        while(root!=null||!deque.isEmpty()){
            while(root!=null){
                deque.push(root);
                root = root.left;
            }
            root = deque.pop();
            if (root.right == null || root.right == prev) {
                res.add(root.val);
                prev = root;
                root = null;
            } else {
                deque.push(root);
                root = root.right;
            }
        }
        return res;
    }
}
递归实现后序遍历
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        order(root,res);
        return res;
    }

    private void order(TreeNode root,List<Integer> res){
        if(root == null){
            return;
        }
        order(root.left,res);
        order(root.right,res);
        res.add(root.val);
    }
}

层次遍历(本质是广度优先搜索)

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();

        if(root == null){
            return res;
        }

        queue.offer(root);
        while(!queue.isEmpty()){
            List<Integer> aver = new ArrayList<>();
            int size = queue.size();
            for(int i = 0;i < size;i++){
                TreeNode node = queue.poll();
                aver.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            res.add(aver);
        }
        return res;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据库的概述 1.数据库的作用:仓库,存储数据。 2.关系型的数据库,保存实体与实体之间的关系。 3.常见的数据库...
    三万_chenbing阅读 4,385评论 0 3
  • 今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MY...
    majorty阅读 5,328评论 0 0
  • 多表查询 关联关系 创建表格时,表与表之间是存在业务关系的。 有哪些 1对1 :有AB两张表,A表中1条数据对应B...
    GuoDJ阅读 5,228评论 0 8
  • 多表查询 在讲解多表查询前,本人先来提出这么一个问题: 现给出一张表employee和一张表project那么,若...
    有事请出门右转阅读 2,563评论 0 1
  • 1. 简介 多表查询就是将多个表的数据横向联合起来。多表查询的分类有:1)内连接2)外链接: 左外链接,右外连接3...
    泡泡龙吐泡泡阅读 2,662评论 0 2