首页 > 其他分享 >数据结构 玩转数据结构 6-7 二分搜索树的中序遍历和后续遍历

数据结构 玩转数据结构 6-7 二分搜索树的中序遍历和后续遍历

时间:2022-11-07 12:56:43浏览次数:76  
标签:node Node 遍历 return 中序 数据结构 root public

0    课程地址

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

 

1    重点关注

1.1    什么是中序遍历和后续遍历

中序遍历:就是先遍历左节点,再遍历根节点,最后遍历右节点。

后序遍历:就是先遍历左节点,再遍历右节点,最后遍历根节点。

 

1.2    中序遍历和后续遍历的应用场景

中序遍历:由于具有从小到大排序的特性,多用于大小排序

后序遍历:从底层到顶层,层层遍历,多用于堆栈的打印。

 

 

2    课程内容


 

3    Coding

3.1    中序遍历和后续遍历

  • 关键代码
/**
     * 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

    }

 

  • 全量代码
package com.company;

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);
    }

    /**
     * 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("==");
        }
    }

}

 

  • 测试类:
package com.company;

public class Main {

    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);
    }
}

 

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

Process finished with exit code 0

 

标签:node,Node,遍历,return,中序,数据结构,root,public
From: https://www.cnblogs.com/1446358788-qq/p/16865544.html

相关文章

  • 根据遍历序列确定二叉树
    二叉树的还原由二叉树的先序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树。根据定义,二叉树的先序遍历是先访问根结点,其次再按先序遍历方式遍历根结......
  • HashMap 的 7 种遍历方式与性能分析!
    参考来自于:HashMap的7种遍历方式与性能分析!方法之1:使用forEachpublicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值......
  • 根据前序遍历和中序遍历构造二叉树
    对于一个二叉树,如果我们我们知道他的前序遍历和中序遍历,那就可以直接构造还原出完整的二叉树。举例:现在有一个二叉树,前序遍历是ABDECFG,中序遍历是DBEACGF。如何确定这个树......
  • 查找——数据结构与算法学习
    查找算法二分查找(初始二分查找)算法原理:就是一个分治的思想:分而治之,不断划分数据的查找范围,就可以提高查找效率,效率达到了O(logn)前提:必须对应的是有序列表//手写二分......
  • 排序——数据结构与算法学习
    排序冒泡排序法(交换)基本原理:依次比较相邻元素的值,使值较大的元素逐渐前移或者后移,因为每一轮排序后值最大的元素一定是后移了一位。//手写冒泡排序法publicstaticvo......
  • 数据结构
    常见的数据结构线性结构包括:线性表、站、队列、双端队列、数组和串1.顺序表(数组)静态顺序表,顺序表只能采用依次遍历的方法2.链表单向非循环链表,双向循环链表3.栈(做递......
  • C语言数据结构 -BST 树的常规操作
       #include<iostream>#include<queue>//bst树structnode{node*lchild;node*rchild;intdata;};voidinsert(node**root,intval)......
  • 套汇问题 Python实现,算法设计,DFS深度遍历
    #P67#套汇问题可以理解为一个有向图找出环的问题,#要想有盈利,需要所有的汇率乘积大于1#在贪心条件下,找到一个环路径上的乘积大于1就有套汇的可能性"""#输入一......
  • 数据结构 图的遍历(广度优先遍历、深度优先遍历)
    8.6、图的广度优先遍历找到与顶点相邻的所有顶点,标记哪些顶点被访问过需要一个辅助队列#include<stdio.h>#include<stdlib.h>#include<math.h>#defineMaxSiz......
  • 105. 从前序与中序遍历序列构造二叉树
    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:  输入:pre......