0    课程地址

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

 

1    重点关注

1.1    二叉树的深度遍历

深度遍历包含前序遍历,中序遍历和后续遍历,与之对应的是广度遍历,见6-10

 

1.2    什么是前序遍历

遍历,就是把二叉树所有节点遍历一遍,前序遍历,就是先遍历节点,再遍历左节点,再遍历右节点。

 

2    课程内容


 

3    Coding

3.1    前序遍历

  • 关键代码
        System.out.println(node.e);//1
        preOrder(node.left);
        preOrder(node.right);

 

  • 全量代码
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);
        }

    }


}

 

  • 测试类:
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);


    }

 

 

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


Process finished with exit code 0

 

 

 

3.2    二叉树深度打印

/**
     * 基于前序遍历完成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("==");
        }
    }



 

posted on 2022-11-07 10:57  菜鸟乙  阅读(129)  评论(0编辑  收藏  举报