美文网首页
二叉树查询问题

二叉树查询问题

作者: 你飞跃俊杰 | 来源:发表于2022-04-14 18:39 被阅读0次

一、 二叉树的前序遍历

image.png

前序遍历的输入顺序为:A-B-D-F-G-H-I-E-C
递归法

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        pre(root,list);
        return list;
    }
    //前序遍历
    void pre(TreeNode root,List<Integer> list){
        //当节点为空时,返回
        if(root == null){
            return;
        }
        list.add(root.val);     //先用list记录当前节点值
        pre(root.left,list);    //递归遍历节点的左子树
        pre(root.right,list);   //递归遍历节点的右子树
    }
}

迭代法

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        
        //Deque是双端队列,可以在两端插入删除元素
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode node = root;
        while (!stack.isEmpty() || node != null) {
            while (node != null) {
                res.add(node.val);  //添加该节点值
                stack.push(node);   //将该节点压入队列中
                node = node.left;   //如果node.left存在,则重复第二个while循环
            }
            node = stack.pop(); //最近压入队列中的节点出队列
            node = node.right;
        }
        return res;
    }
}

二、二叉树的中序遍历

image.png

中序遍历的输入顺序为:F-D-H-G-I-B-E-A-C
递归法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        mid(root,list);
        return list;
    }
    void mid(TreeNode root,List<Integer> list){
        if(root == null){
            return;
        }
        mid(root.left,list);    //直接递归到最左节点
        list.add(root.val);     //添加该节点的值
        mid(root.right,list);   //再递归右子树
    }
}

迭代法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Deque<TreeNode> stk = new LinkedList<TreeNode>();
        while (root != null || !stk.isEmpty()) {
            while (root != null) {  //当压入到最左节点时停止
                stk.push(root);     //不断压入
                root = root.left;
            }
            root = stk.pop();   //通过出队列,节点不断往上走
            res.add(root.val);
            root = root.right;
        }
        return res;
    }
}

三、二叉树的后序遍历

image.png

后序遍历的输入顺序为:F-H-I-G-D-E-B-C-A
递归法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        mid(root,list);
        return list;
    }
    void mid(TreeNode root,List<Integer> list){
        if(root == null){
            return;
        }
        mid(root.left,list);    //直接递归到最左节点
        mid(root.right,list);   //再看右子树
        list.add(root.val);     //最后添加该节点的值
    }
}

四、二叉树的层序遍历

image.png

层序遍历
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
广度优先搜索BFS

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list1= new ArrayList<List<Integer>>();
        if(root == null){
            return list1;
        }
        //BFS
        Queue<TreeNode> queue = new LinkedList<TreeNode>(); //单端队列,先进先出
        queue.add(root);
        while(!queue.isEmpty()){
            List<Integer> list2= new ArrayList<Integer>();
            int size = queue.size();    //size为当前队列的长度
            for(int i=1;i<=size;i++){
                TreeNode node = queue.poll(); //将一个节点出队列
                list2.add(node.val);    //添加该节点的值
                if(node.left != null){  //如果有左子树,左子树进队列
                    queue.add(node.left);
                }
                if(node.right != null){ //如果有右子树,右子树进队列
                    queue.add(node.right);
                }
            }
            //在一个for循环后,这同一层的节点值都在lsit2中了
            list1.add(list2);
        }
        return list1;
    }
}

相关文章

  • 红黑树

    传统二叉树的问题   通过实现二叉树,了解了二叉树的主要特点:数据查询的时候可以提供更好的查询性能,但是这种原始的...

  • 二叉树查询问题

    一、 二叉树的前序遍历 前序遍历的输入顺序为:A-B-D-F-G-H-I-E-C递归法 迭代法 二、二叉树的中序遍...

  • 索引为什么选择B+Tree

    若采用二叉树: 缺点是:若是一个斜二叉树,查询速度和全表扫描没有区别,图如下,所以查询速度由结点的分布决定 若采用...

  • 互联网大厂offer收割之二叉树的遍历及15个延伸面试题

    二叉树通常是用来在内存中存储大量数据的,而数据存储的目的自然是为了后面的查询。对于普通二叉树来说,查询其实就是逐个...

  • 对于人工智能核心-向量的理解

    人工智能的初步了解 机器学习 在知识底库中查询,核心为查询的算法; 传统意义上我们会在链表、二叉树、数组中查询,但...

  • 公共祖先问题

    前言:逃不开的「公共祖先」问题 0X00 一次查询 236. 二叉树的最近公共祖先 用 set 写比较简单,注意其...

  • 二十一. java数据结构 - 多路查找树

    1. 二叉树的问题分析 二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的,如果二叉...

  • 红黑树原理

    红黑树原理 学习红黑树之前,你首先要有查询二叉树的知识储备,和平衡二叉树(AVL)的知识储备。 红黑树是基于AVL...

  • 数据结构之二叉树与B树

    二叉树与B树 1.1二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的,如果二叉树的...

  • leecode刷题(24)-- 翻转二叉树

    leecode刷题(24)-- 翻转二叉树 翻转二叉树 翻转一棵二叉树。 示例: 输入: 输出: 备注:这个问题是...

网友评论

      本文标题:二叉树查询问题

      本文链接:https://www.haomeiwen.com/subject/ueltertx.html