排序二叉树类

1.递归(补充)

(1)什么是递归?

​ 方法(函数)调用其自身的过程。

(2)如何使用递归?

step1. 将大的问题拆分成类似的小的问题。

​ step2. 找到小的问题的答案。

(3)案例:计算一个数的阶乘

在这里插入图片描述
在这里插入图片描述

2.二叉树
(1)树的相关知识

在这里插入图片描述
(2)排序二叉树(查找二叉树)

在这里插入图片描述
​ 2) 二叉树的遍历

​ a.先序遍历(了解): 先访问根节点,然后先序遍历左子树,最后先序遍历右子树

​ b.中序遍历(重点):先中序遍历左子树,然后访问根节点,最后中序遍历右子树。

​ c.后序遍历(了解):先后序遍历左子树,然后后序遍历右子树,最后访问根节点。

在这里插入图片描述
3)排序二叉树的实现
在这里插入图片描述

在这里插入图片描述

代码实现

package tree;

/**
 *排序二叉树类
 * 二叉树不允许有重复的数据
 */
public class Tree<E extends Comparable<E>> {
    //用于存放根节点的引用
    private Node root;
    /**
     * Node类用于描述二叉树当中的某个节点
     * 其中,data用于存放数据(即元素),left和
     * right用于存放其左右子树的引用
     */
    class Node{
        E data;
        Node left;
        Node right;

        Node(E e) {data = e;}

        //将e添加到当前节点下面
        public boolean append(E e){
            /*
                要添加的元素跟当前节点中存放的元素相等,
                则不用添加了(排序二叉树不允许有重复的数据)
            */
            if (data.compareTo(e)==0){ return false;}
            /*
                要添加的元素比当前节点中的存放的元素小,则该元素
                要添加到当前节点的左边,否则添加到当前节点的右边
            */
            if (data.compareTo(e)>0){
                /*
                    添加到左边又分两种情况
                    1:左子树为空
                    2:左子树不为空
                */
                if (left==null){
                    //如果左子树为空,则当前元素先封装成一个节点,然后作为其左子树
                    left = new Node(e);
                    return true;
                }else {
                    //如果左子树不为空,则将该元素添加到其左子树下面(递归调用).
                    return left.append(e);
                }
            }else {
                //添加到当前节点右边.
                if (right==null){
                    right = new Node(e);
                    return true;
                }else {
                    return right.append(e);
                }
            }
        }

        /**
         * 对当前节点按照中序遍历的规则进行访问
         * @param str
         */
        public void inOrder(StringBuilder str) {
            //如果左子树不为空,则中序遍历其左子树
            if (left!=null){
                left.inOrder(str);
            }
            //然后访问该节点
            str.append(data+",");
            //如果右子树不为空,则中序遍历其右子树
            if (right!=null){
                right.inOrder(str);
            }
        }
    }

    /**
     * 将元素添加到二叉树里面
     * @param e 要添加的元素
     * @return
     */
    public boolean add(E e){
        //如果二叉树为空,则将该元素先封装成一个节点,然后该节点成为其根节点
        if (root==null){
            root = new Node(e);
        }else {
            //如果二叉树不为空,则将该元素添加到该元素的根节点下面
            return root.append(e);
        }
        return true;
    }

    @Override
    public String toString() {
        if (root==null){
            return "[]";
        }
        StringBuilder str = new StringBuilder();
        root.inOrder(str);
        //删除最后那一个逗号","
        str.delete(str.lastIndexOf(","),str.length());
        return "["+str.toString()+"]";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值