首页 > 其他分享 >数据结构 玩转数据结构 6-10 二分搜索树的层序遍历

数据结构 玩转数据结构 6-10 二分搜索树的层序遍历

时间:2022-11-08 12:45:55浏览次数:66  
标签:node 10 数据结构 return cur 层序 遍历 null root

0    课程地址

https://coding.imooc.com/lesson/207.html#mid=13471

 

1    重点关注

1.1    队列实现层序遍历 定义和应用场景

定义:由上到下,一层层遍历,又称为广度遍历

应用场景:算法求解,在算法如走出迷宫的路径等方法中,有最短路径问题,通过这种方法能够快速求解

 

1.2    队列实现层序遍历 实现

见3.1

 

2    课程内容

 

 

3    Coding

3.1    用队列实现层序遍历

  • 关键代码
    /**
     * 二分搜索树广度遍历
     * @author weidoudou
     * @date 2022/11/8 11:23
     * @return boolean
     **/
    public boolean levelOrder(){
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);

        while (queue.peek()!=null){
            Node cur = queue.peek();
            System.out.println(cur.e);
            queue.remove();
            if(cur.left!=null){
                queue.add(cur.left);
            }
            if(cur.right!=null){
                queue.add(cur.right);
            }
        }
        return false;
    }

 

  • 全量代码
package com.company;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class BST2<E extends Comparable> {

    //1     内部类
    private class Node{
        //二叉树特有属性
        private Node left,right;
        private E e;
        private Node(E e){
            this.e = e;
            this.left = null;
            this.right = null;
        }
    }

    private int size;
    private Node root;

    public BST2(){
        this.size = 0;
        this.root = null;
    }

    /**
     * 定义基本方法 getSize
     * @author weidoudou
     * @date 2022/11/3 12:57
     * @return int
     **/
    public int getSize(){
        return size;
    }

    /**
     *查询是否为空
     * @author weidoudou
     * @date 2022/11/3 12:58
     * @return boolean
     **/
    public boolean isEmpty(){
        return size == 0;
    }

    //2     循环添加元素,把null也看作节点
    public void add(E e){
        root = add(e,root);
    }

    //3     递归,添加元素
    public Node add(E e,Node root){
        //3.1   终止条件
        if(root==null){
            size++;
            return new Node(e);
        }

        //3.2   递归
        //3.2.1 递归左孩子
        if(e.compareTo(root.e)<0){
            root.left = add(e,root.left);
        }

        //3.2.2 递归右孩子
        if(e.compareTo(root.e)>0){
            root.right = add(e,root.right);
        }

        //点睛之笔
        return root;
    }

    /**
     * 二分搜索树 是否包含元素e
     * @author weidoudou
     * @date 2022/11/4 9:55
     * @param e 请添加参数描述
     * @return boolean
     **/
    public boolean contains(E e){
        return contains(e,root);
    }

    /**
     * 二分搜索树查询 递归
     * @author weidoudou
     * @date 2022/11/4 9:57
     * @param e 请添加参数描述
     * @param  node 请添加参数描述
     * @return boolean
     **/
    private boolean contains(E e,Node node){
        //终止条件
        if(node == null){
            return false;
        }
        if(e.compareTo(node.e)==0){
            return true;
        }

        //递归条件
        if(e.compareTo(node.e)<0){
            return contains(e,node.left);
        }else{
            return contains(e,node.right);
        }

    }

    /**
     * 4     二分搜索树,前序遍历 顾名思义,先遍历根节点,再遍历左节点,最后遍历右节点
     * @author weidoudou
     * @date 2022/11/5 14:54
     * @return null
     **/
    public boolean preOrder(){
        preOrder(root);
        return false;
    }

    //前序遍历 递归
    private void preOrder(Node node){
        //终止条件
        if(node==null){
            return;
        }

        //递归
        System.out.println(node.e);//1
        preOrder(node.left);
        preOrder(node.right);
    }

    /**
     *  前序遍历非递归写法 用栈的方法实现 while 代替递归
     * @author weidoudou
     * @date 2022/11/8 9:57
     *
     * @return*/
    public boolean preOrderNR(){
        Stack<Node> stack = new Stack<>();
        stack.push(root);

        while(!stack.isEmpty()){
            Node cur = stack.peek();
            stack.pop();
            System.out.println(cur.e);
            if(cur.right!=null){
                stack.push(cur.right);
            }

            if(cur.left!=null){
                stack.push(cur.left);
            }
        }
        return false;
    }

    /**
     * 二分搜索树广度遍历
     * @author weidoudou
     * @date 2022/11/8 11:23
     * @return boolean
     **/
    public boolean levelOrder(){
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);

        while (queue.peek()!=null){
            Node cur = queue.peek();
            System.out.println(cur.e);
            queue.remove();
            if(cur.left!=null){
                queue.add(cur.left);
            }
            if(cur.right!=null){
                queue.add(cur.right);
            }
        }
        return false;
    }


    /**
     * 5     二分搜索树,中序遍历 顾名思义,先遍历左节点,再遍历根节点,最后遍历右节点
     * @author weidoudou
     * @date 2022/11/5 14:54
     * @return null
     **/
    public boolean inOrder(){
        inOrder(root);
        return false;
    }

    //前序遍历 递归
    private void inOrder(Node node){
        //终止条件
        if(node==null){
            return;
        }

        //递归
        inOrder(node.left);
        System.out.println(node.e);//1
        inOrder(node.right);
    }

    /**
     * 6     二分搜索树,后序遍历 顾名思义,先遍历左节点,再遍历右节点,最后遍历根节点
     * @author weidoudou
     * @date 2022/11/5 14:54
     * @return null
     **/
    public boolean postOrder(){
        postOrder(root);
        return false;
    }

    //前序遍历 递归
    private void postOrder(Node node){
        //终止条件
        if(node==null){
            return;
        }

        //递归
        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.e);//1

    }



    /**
     * 基于前序遍历完成toString打印
     * @author weidoudou
     * @date 2022/11/5 15:20
     * @return java.lang.String
     **/
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer();
        generate(root,0);
        return sb.toString();
    }

    private void generate(Node node, int depth){
        generate(depth);
        //1     终止条件
        if(node==null){
            System.out.println("null");
            return;
        }

        //2     递归条件
        System.out.println(node.e);
        depth++;
        generate(node.left,depth);
        generate(node.right,depth);
    }

    private void generate(int depth){
        for(int i = 0;i<depth;i++){
            System.out.print("==");
        }
    }

}

 

  • 测试类:
    public static void main(String[] args) {
        BST2<Integer> bst2 = new BST2<>();
        int [] nums = {5,3,6,8,4,2};
        for(int i = 0;i<nums.length;i++){
            bst2.add(nums[i]);
        }

        System.out.println(bst2.preOrder());
        /*System.out.println(bst2.inOrder());
        System.out.println(bst2.postOrder());
        System.out.println(bst2.preOrderNR());*/
        System.out.println(bst2.levelOrder());


        //System.out.println(bst2);
    }

 

  • 测试结果:
5
3
2
4
6
8
false
5
3
6
2
4
8
false

Process finished with exit code 0

 

标签:node,10,数据结构,return,cur,层序,遍历,null,root
From: https://www.cnblogs.com/1446358788-qq/p/16869279.html

相关文章

  • SBT20100VDC-ASEMI贴片肖特基二极管SBT20100VDC
    编辑:llSBT20100VDC-ASEMI贴片肖特基二极管SBT20100VDC型号:SBT20100VDC品牌:ASEMI封装:TO-263正向电流:20A反向电压:100V引线数量:3芯片个数:2芯片尺寸:87MIL漏电流:10ua恢复时间:5ns......
  • 10个值得你去试试的React开发工具
    JavaScript每天都在出现大量的框架和工具,而React是除了上次我们提到的Vue和Ember之外另一款比较流行的框架。但因为新的工具每天都在不断的出现,开发者在尝试时总会有些不知......
  • SBT20100VDC-ASEMI贴片肖特基二极管SBT20100VDC
    编辑:llSBT20100VDC-ASEMI贴片肖特基二极管SBT20100VDC型号:SBT20100VDC品牌:ASEMI封装:TO-263正向电流:20A反向电压:100V引线数量:3芯片个数:2芯片尺寸:87MIL漏电流:10ua......
  • 解决本机win10与Linux虚拟机(ubuntu)ping 不通github的问题
    一、解决本机win10与Linux虚拟机(ubuntu)ping 不通github的问题参考链接:(32条消息)Ubuntu20.04、windows10解决无法ping通github.com的问题(亲测有效,避免入坑)_☞不平......
  • Jmeter安装+环境变量配置(Win10环境)
    一、JDK安装安装Jmeter前需要安装JDK下载网址:https://www.oracle.com/进入网页后,点击Product,选择Java。  下拉,选择OracleJDK 下拉,选择你需要的环境,这里是Win......
  • windows10使用wsl
    原文连接点击下载Ubuntu22.04LTS双击第一步下载好的安装包,后面跟着提示操作。至于是否升级为wsl2,还未研究透彻,按照官方的命令操作,提示命令无效。......
  • 【JavaScript 教程】第六章 数组03— Stack :使用 Array 的push()和pop()方法实现堆栈
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节,我们学习了JavaScriptArray length属性以及如何正确处理它,错过的小伙伴可以点击文章《​​【JavaScrip......
  • VBA代码助手功能概览,可以瞬间10倍提升VBA编程速度
    VBA代码助手下载地址主要功能:VBA代码库管理视频演示内置VBA常用代码库,自定义代码库收藏管理,代码库导入导出神键手输入提示视频演示VBA代码关键字自动补全,中文......
  • 数据结构与算法
    数据结构基础知识体系系统性梳理  学习思路避免孤立的学习知识点,要关联学习。比如实际应用当中,我们经常使用的是查找和排序操作,这在我们的各种管理系统、数据库......
  • 计算机等级考试二级C语言上机题集(第96~100套)
    第96套1.程序填空题给定程序中,函数fun的功能是:将形参s所指字符串中的数字字符转换成对应的数值,计算出这些数值的累加和作为函数值返回。例如,形参s所指的字符串为:abs5def1......