二叉树他们都需要满足一个基本性质--即树中的任何节点的值大于它的左子节点,且小于它的右子节点。按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低(O(n)),所以为了维持二叉树的平衡,大牛们提出了各种实现的算法,如:AVLSBT伸展树TREAP ,红黑树等等。

平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近。

两个节点要想可达必须是父子关系。    从根节点到任一节点只有一条路径。    一个节点只有一个父节点多个子节点。一个节点的所有父节点路径是唯一的。     

任何一个节点只有一个父节点,从下往上走只有一条路径,其他节点在这个路径上就可以到达,不在路径上的节点就到达不了,每一层在这个路径上的只有一个节点。

二分查找的查找效率高于顺序查找,但不适合插入。

要支持高效的插入操作,我们似乎需要一种链式结构。

单链接的链表是无法使用二分查找的,因为二分查找的高效来自于能够快速通过索引取得任何子数组的中间元素。为了将二分查找的效率和链表的灵活性结合起来,我们需要更加复杂的数据结构。

能够同时拥有两者的就是二叉查找树BST

交换所有节点的左右子树:

public class InvertBinaryTree {
//交换所有节点
public TreeNode invertTree(TreeNode root) {
if (root != null) {
TreeNode t = root.left;// 交换根
root.left = root.right;
root.right = t;
invertTree(root.left);// 交换左子树
invertTree(root.right);// 交换右子树
return root;
} else {
return null;
}
} // 层序遍历
public TreeNode invertTree_bfs(TreeNode root) {
if (root == null) {
return null;
} else {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode p = queue.poll();
TreeNode t = p.left;
p.left = p.right;
p.right = t;
if (p.left != null) {
queue.offer(p.left);
}
if (p.right != null) {
queue.offer(p.right);
} }
return root;
}
}
}
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) {
val = x;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
super();
this.val = val;
this.left = left;
this.right = right;
}
public TreeNode() {
super();
}
}

二叉排序树也叫二叉搜索树也叫Binary Sort Tree也叫Binary Search Tree也叫BST

具有如下性质:

定义空树是一个BST

左子树所有结点的值均小于根结点的值

右子树所有结点的值均大于根结点的值

左右子树都是BST(递归定义)

中序遍历序列为升序

依次插入4、2、6、2、1、3、5、1、7:
插入4根节点直接插入,插入2小于4在左边,插入6大于4在右边,插入2小于4在左边,在和4的左边2比较,相等不用插入,插入1小于4在左边,左边有2,小于2在2的左边,插入3小于4在左边,大于2在右边,5大于4在右边,5小于6在左边,1小于4在左边,1小于2在左边,有一个1相等就不动,7大于4大于6.

键值对的插入:

依次插入{4:a},{2:b},{6:c},{2:d},{1:a},{3:d},{5:e},{1:f}

{2:d}替换{2:b},{1:f}替换{1:a}

二叉搜索树Binary Search Tree BST:一边大一边小。

AVL:一边大一边小,同时左右子树高度差只能为0,1。解决了二叉搜索树的极端条件就是成为链表。

红黑树:RedBlackTree、RBT。AVL树的调整需要左右旋转,AVL的查找效率高但是插入和删除效率低,就出现红黑树。

1.红黑树不像AVL一样,永远保持绝对平衡

2.相对平衡

3.若H(left)>=H(right),则:H(left)<=2*H(right)+1,但BH(left)===BH(right)黑高相等,H(left)<H(right)同理

4.定理:N个节点的RBT,最大高度是2log(N+1),严格证明参考CLRS

5.查询效率RBT低于AVL

6.插入、删除效率好于AVL

红黑树是平衡二叉树,平衡儿茶B树,本质是一课B-tree。小的在一边大的在另一边,为了防止都是小的变成链表,所以要平衡。

AVL是通过高度实现的平衡,SBT是通过节点域维持平衡的,红黑树通过红黑节点维持平衡。红黑树中序遍历单调不减。

第一棵树:違反中序遍歷不減。

第三课:根节点是黑色。

第四课:红节点子节点是黑色。

第五棵:黑高不相等。

红黑树的遍历简单:小于就走左边,大于就走右边,。

遍历分为广度优先和深度优先。

红黑树从根到叶子节点的最长路径不会超过最短路径的2。就保证了自平衡性,不会造成节点全在一个路径上导致变成链表而使得查找效率低。

map.put(12, 12);
map.put(1, 1);
map.put(9, 9);
map.put(2, 2);
map.put(0, 0);
map.put(11, 11);
map.put(7, 7);
map.put(19, 19);
map.put(4, 4);
map.put(15, 15);

TreeMap的接口:

TreeMap源码分析1的更多相关文章

  1. Java集合之TreeMap源码分析

    一.概述 TreeMap是基于红黑树实现的.由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的C ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. TreeMap 源码分析

    简介 TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现.TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey.get.p ...

  4. TreeMap源码分析,看了都说好

    概述 TreeMap也是Map接口的实现类,它最大的特点是迭代有序,默认是按照key值升序迭代(当然也可以设置成降序).在前面的文章中讲过LinkedHashMap也是迭代有序的,不过是按插入顺序或访 ...

  5. 死磕 java集合之TreeMap源码分析(四)-内含彩蛋

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历.中序遍历.后序遍历. (1)前序遍历,先遍历 ...

  6. 死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 删除元素 删除元素本身比较简单,就是采用二叉树的删除规则. (1)如果删除的位置有两个叶子节点 ...

  7. 死磕 java集合之TreeMap源码分析(二)- 内含红黑树分析全过程

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 插入元素 插入元素,如果元素在树中存在,则替换value:如果元素不存在,则插入到对应的位置, ...

  8. 死磕 java集合之TreeMap源码分析(一)- 内含红黑树分析全过程

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历. 继承体系 Tr ...

  9. TreeMap源码分析

    MapClassDiagram

  10. java.util.TreeMap源码分析

    TreeMap的实现基于红黑树,排列的顺序根据key的大小,或者在创建时提供的比较器,取决于使用哪个构造器. 对于,containsKey,get,put,remove操作,保证时间复杂度为log(n ...

随机推荐

  1. Markdown温故知新(4):更多扩展语法及HTML

    1.强调(删除 & 高亮) 2.脚注(注脚) 3.数学公式 4.更多扩展语法 5.终极扩展之内嵌 HTML 5.1.文本修饰类标签 5.2.内容排版类标签 5.3.图片及多媒体标签 5.4.锚 ...

  2. Golang中,Aes加解密

    今天在用Golang解析php那边用Aes加密的一个key.网上大多是用base64将结果编码一下.而且用到了向量.我php 那边没有用到向量.所以golang这边也是要去掉的.参考网站的改了下.能够 ...

  3. 基于tensorflow训练模型的显存不足解决办法

    import tensorflow as tfimport osos.environ["CUDA_VISIBLE_DEVICES"] = '0' #指定第一块GPU可用config ...

  4. tf.Session()函数的参数应用(tensorflow中使用tf.ConfigProto()配置Session运行参数&&GPU设备指定)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dcrmg/article/details ...

  5. VMware + CentOS 7搭建环境(二)

    1.环境要求建议使用VMwareWorkstation虚拟机软件:可以使用快照功能,保存虚拟机状态:本文档示例版本10.0.1:1.2 CentOS系统的iso文件; 下载好的.iso的压缩文件格式, ...

  6. How to prove that SAP CRM WebUI is a stateful application

    I create an enhancement in this function module to print out current session id: As long as I do not ...

  7. 结对编程(Python实现)

    一.Github地址:https://github.com/nullcjm/mypage 项目搭档:3117004662梁子豪 3117004648陈俊铭 二.PSP表格: PSP2.1 Person ...

  8. Centos系统 tomcat 中的应用与北京时间相差8小时

    解决方法: 在 catalina.sh中的 JAVA_OPTS 加上 -Duser.timezone=GMT+08  启动时 startup.sh 会调用 catalina.sh.

  9. ggplot2学习笔记之图形排列

    转载:https://www.jianshu.com/p/d46cf6934a2f R语言基本绘图函数中可以利用par()以及layout()来进行图形排列,但是这两个函数对于ggplot图则不太适用 ...

  10. KVM虚拟机嵌套虚拟化

    KVM虚拟机嵌套虚拟化 背景介绍 ​ 在Arch linux的 KVM 虚拟机上启动来部署开源Iaas系统zstack时,需要开启虚拟机嵌套虚拟化. 解决 ​ KVM 嵌套式虚拟 Nested 是一个 ...