关于best二叉树不得不知道的那些知识

58 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

排序二叉树前言

在上一篇文章里,就是关于树的知识,以及树的一种典型分支二叉树,然后又完成了一种二叉树的实例——表达式树。通过表达式树我们可以知道其前缀,中缀以及后缀表达式(如果你真的去完成)。但是表达式树依旧common,所以接下来我就会介绍下排序二叉树也叫查找二叉树。

排序二叉树

对于排序二叉树来说,他首先也是一种二叉树,但是他对每个节点的值都具有约束,比如说左节点是比父节点parent要小的,右节点则是恰恰相反是比较大的。这就要求我们的结点都是能排序的,最后实现Comparable接口,重写对应的compareTo方法,当然你也可以不写,只不过局限性较大吧了。

 @Override
    public int compareTo(huffmanTreeNode o) {
        return this.data-o.data;//代表从小到大排序,如果是从大到小就是外面括号加一个-

    }

在创建的时候直接把树的root节点赋值实例化就好了。然后就是循环执行插入insert方法。

public void insert(Node node, int data) {

    //先对数据进行校验
    if (node == null) {
        return;
    }

    if (node.data < data) {
        if (node.rNode == null) {
            Node tempNode = new Node(data);
            node.rNode = tempNode;
        } else {
            insert(node.rNode, data);
        }
    }

    if (node.data >= data) {
        if (node.lNode == null) {
            Node tempNode = new Node(data);
            node.lNode = tempNode;
        } else {
            insert(node.lNode, data);
        }
    }

}

在创建后一棵排序二叉树后,你就可以找些对应的finmin和finmax还有contains,还有remove方法。remove之前的方法跟insert方法是不无二致的。但是remove的方法值得再分一节讨论。

remove方法

这里删除包括了三种情况,删除的结点1.一个子节点都没有2.具有一个子节点3.具有两个子节点(最麻烦的一种)。

没有子节点

没有子节点的,找到对应节点的父节点然后置空就好了。

一个子节点

这个就让父节点接那个要删除节点的子节点就好了。

两个节点

让左节点想上一种情况操作,然后用一个临时变量接到一个删除节点的父节点,然后接到左节点的最右边,这是一种方式,但是最后一种方式删除多了最后可能会成为链表,你也可以在节点处设置变量代表其是否删除。针对这个我们后面会采取avl处理。