自己实现Java中二叉查找树的部分功能(待补充)

用于实现二叉查找树的节点对象

package custom.tree;

/**
 * 用于实现二叉树结构的节点
 */
public class TreeNode<E> {

    //左叶子节点
    private TreeNode<E> left;
    //右叶子节点
    private TreeNode<E> right;
    //节点上的数据
    private E data;

    public TreeNode() {
        super();
    }

    public TreeNode(TreeNode<E> left, TreeNode<E> right, E data) {
        super();
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public TreeNode<E> getLeft() {
        return left;
    }

    public void setLeft(TreeNode<E> left) {
        this.left = left;
    }

    public TreeNode<E> getRight() {
        return right;
    }

    public void setRight(TreeNode<E> right) {
        this.right = right;
    }

    public E getData() {
        return data;
    }

    public void setData(E data) {
        this.data = data;
    }
}

二叉树的具体实现代码:

package custom.tree;

import java.util.Comparator;

//二叉查找树
public class BinaryTree<E> {
    // 根节点
    private TreeNode<E> root;
    // 比较器,用来比较存放的数据
    private Comparator<? super E> comparator;

    public BinaryTree() {
    }

    // 传入比较器
    public BinaryTree(Comparator<? super E> comparator) {
        this.comparator = comparator;
    }

    //获取根节点
    public TreeNode<E> getRoot() {
        return root;
    }

    //获取最右边的节点  
    public TreeNode<E> getMaxNode(){
        TreeNode<E> p = root;
        if(p.getRight() != null){
            p = p.getRight();
        }
        return p;
    }


    /**
     *  用来比较节点中的数据的大小,模仿TreeMap的源码
     *  若  e1 > e2 ,返回正数
     */
    public int compare(E e1, E e2) {
        return comparator == null ? ((Comparable<? super E>) e1).compareTo((E) e2) : comparator.compare((E) e1, (E) e2);
    }

    /**
     * 添加数据同时对数据进行排序
     * 建立二叉树结构
     */
    public void add(E data) {
        TreeNode<E> node = new TreeNode<E>();
        node.setData(data);

        if (root == null) {
            root = node;
        } else {
            TreeNode<E> tar = root;
            while (true) {
                int r = compare(data,tar.getData());
                if(r > 0){
                    TreeNode<E> right = tar.getRight();
                    if(right == null){
                        tar.setRight(node);
                        break;
                    }else{
                        tar = right;
                    }
                }else if(r < 0){
                    TreeNode<E> left = tar.getLeft();
                    if(left == null){
                        tar.setLeft(node);
                        break;
                    }else{
                        tar = left;
                    }
                }else{
                    break;
                }
            }
        }

    }

    /**
     * 使用递归遍历查找节点
     * 从左到右输出节点上的数据
     */
    public void foreachNode(TreeNode<E> treeNode){

        if(treeNode.getLeft() != null)
            foreachNode(treeNode.getLeft());

        System.out.println(treeNode.getData());

        if(treeNode.getRight() != null)
            foreachNode(treeNode.getRight());

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值