二叉树与红黑树

二叉树结构简介

  • 在进行链表结构开发的过程之中会发现所有的数据按照首尾相连的状态进行保存,那么当要进行某一个数据查询的时候(判断该数据是否存在),这种情况下它所面对的时间复杂度是“O(n)”,如果说现在它的数据量小(不超过30个)的情况下,那么性能上是不会有太大的差别的,而一旦保存的数据量很大,这个时候时间复杂度就会严重损耗程序的运行性能,那么对于数据的存储结构就必须发生改变,尽可能的减少检索次数进行设计,对于现在的数据结构而言,最好的性能就是“O(logn)”,所以现在要想实现它就可以利用二叉树的结构来完成;
  • 如果想要实现一棵树结构的定义,那么就需要去考虑数据的存储形式,在二叉树的实现之中其基本实现原理如下:
    • 取第一个数据为保存的根结点,小于等于根结点的数据要放在节点的左子树,而大于根结点的数据要放在节点的右子树;
此图来源于李兴华老师
  • 如果要进行数据检索的话,此时就需要进行每个节点的判断,但是它的判断是区分左右的,所以不会是整个的结构都进行判断处理,那么他的时间复杂度就是O(logn);
  • 对于二叉树而言,进行数据获取的时候有三种形式:前序遍历(根-左-右)、中序遍历(左-根-右)、后序遍历(左-右-根);
  • 现在以中序遍历为主,以上数据中序遍历的结果:10、20、25、30、38、50、80、100,可以发现二叉树中的内容全部都属于排序的结果;

二叉树基础实现

  • 在实现二叉树的处理之中最为关键性的问题在于数据的保存,而且数据由于牵扯到对象比较的问题,那么一定有比较器的支持,而这个比较器首选的一定是Comparable1,所以本次将保存一个Person类数据:
class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Person per) {
        return this.age - per.age;
    }
    @Override
    public String toString() {
        return "【Person类对象】姓名:" + this.name + "、年龄:" + this.age + "\n";
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}
  • 如果想要进行数据的保存,首先一定需要一个节点类,节点类里面由于牵扯到数据的保存问题,所以必须使用Comparable(可以区分大小);
import java.util.Arrays;
/**
* @Description: 实现二叉树操作
* @Author: mars_wu
* @Date: 2021/1/4 下午4:24
*/ 
class BinaryTree<T extends Comparable<T>> {
    private class Node {
        private Comparable<T> data;     //存放Comparable,用以比较大小
        private Node parent;        //保存父节点
        private Node left;      //保存左子树
        private Node right;     //保存右子树
        public Node(Comparable<T> data) {       //构造方法直接进行数据存储
            this.data = data;
        }
        /** 
        * @Description: 实现节点数据的适当位置存储 
        * @Param: [newNode创建的新节点]
        * @return: void 
        * @Author: mars_wu
        * @Date: 2021/1/4 下午4:35
        */ 
        public void addNode(Node newNode) {
            if (newNode.data.compareTo((T)this.data) <= 0) {
                if (this.left == null) {
                    this.left = newNode;
                    newNode.parent = this;
                } else {
                    this.left.addNode(newNode);
                }
            } else {
                if (this.right == null) {
                    this.right = newNode;
                    newNode.parent = this;
                } else {
                    this.right.addNode(newNode);
                }
            }
        }
        /** 
        * @Description: 实现所有数据的获取处理,按照中序遍历的形式完成
        * @Author: mars_wu
        * @Date: 2021/1/4 下午5:12
        */ 
        public void toArrayNode() {
            if (this.left != null) {
                this.left.toArrayNode();
            }
            BinaryTree.this.returnData[BinaryTree.this.foot++] = this.data;
            if (this.right != null) {
                this.right.toArrayNode();
            }
        }
    }
    private Node root;
    private int count;
    private Object [] returnData;
    private int foot = 0;
    /** 
    * @Description: 进行数据保存 
    * @Param: [data要保存的数据内容为null时抛出异常NullPointerException]
    * @return: void
    * @Author: mars_wu
    * @Date: 2021/1/4 下午4:28
    */ 
    public void add(Comparable<T> data) {
        if (data == null) {
            throw new NullPointerException("保存的数据不允许为空");
        }
        Node newNode = new Node(data);
        if (this.root == null) {
            this.root = newNode;
        } else {
            this.root.addNode(newNode);
        }
        this.count++;
    }
    /** 
    * @Description: 以对象数组的形式返回全部数据,没有数据时返回null
    * @return: java.lang.Object[] 全部数据
    * @Author: mars_wu
    * @Date: 2021/1/4 下午5:09
    */ 
    public Object [] toArray() {
        if (this.count == 0) {
            return null;
        }
        this.returnData = new Object[this.count];
        this.foot = 0;
        this.root.toArrayNode();
        return this.returnData;
    }
}
public class BinaryTreeApi {
    public static void main(String[] args) throws Exception {
        BinaryTree<Person> tree = new BinaryTree<Person>();
        tree.add(new Person("张三-50", 50));
        tree.add(new Person("李四-80", 80));
        tree.add(new Person("王五-30", 30));
        tree.add(new Person("牛六-10", 10));
        tree.add(new Person("刘七-60", 60));
        tree.add(new Person("吴八-20", 20));
        tree.add(new Person("赵九-70", 70));
        System.out.println(Arrays.toString(tree.toArray()));
    }
}
  • 在进行数据添加的时候只是实现了节点关系的保存,而这种关系保存后的结果就是所有的数据都属于有序排列;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容