数据结构基础:二叉树,堆,多叉树
2015-11-05 22:19
281 查看
二叉树是综合了数组和链表的优点和缺点(数组插入效率低,链表查找效率低)
二叉树的存储结构一般采用二叉链表,树中每一个结点都有一个数据域data还有两个分别用于指向该节点的左右儿子结点的指针域,通过这两个指针域建立了上下层结点的关系.
二叉树的一些特性就不详细说了,很多资料都有,直接看看典型的二叉树.
二叉查找树
二叉查找树是满足以下条件的二叉树:
1.左子树上的所有节点值均小于根节点值,
2右子树上的所有节点值均不小于根节点值
简单的构造一个二叉查找树
/*查找一个特定的关键字*
TREE_SEARCH(root,k)
IF root=NIL or k=key[root]
RETURN root;
IF k<key[root]
TREE_SEARCH(left[x],k)
ELSE
TREE_SEARCH(right[x],k)
对一颗高度为H的二叉查找树,动态集合操作search,minnum,maxnum...的时间复杂度都为O(H)
插入,删除等操作复杂一些, 重点在于理解,可以参考: http://www.cnblogs.com/aiyelinglong/archive/2012/03/27/2419972.html
红黑树
二叉搜素树如果插入的是随机数,则执行效果较好,当要插入的是有序的数据(10,23,25,78)那么此时二叉树会成了非平衡二叉树,而对于非平衡二叉树,它的快速查找(插入,删除)能力就丧失了.
红黑树(属于查找二叉树)是一种很有意思的平衡检索树, 简单来讲就是为了避免树的不平衡,增加了颜色这个属性来平衡二叉查找树。
TreeMap就是红黑树实现的;
红黑树旋/颜色变换的实现比较复杂,参考:
http://blog.csdn.net/v_july_v/article/details/6105630
红黑树的效率:
查找时间和普通二叉搜索树几乎完全一样,因为在查找的过程中并没有应用红黑树的特征.只是增加了每一个结点的存储空间来存储颜色;
插入和删除操作和普通的二叉搜索树时间上的开销略有增加,因为要执行颜色变换和旋转.
堆
堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。
具体的原理和实现这个帖子写的比较好,我就省了
/article/3478151.html
堆实现的主要操作就是 插入和 删除(移除并获取那个最符合条件的元素)。先简单描述下逻辑
插入:1. 将新插入的元素,放置到队列的尾部。
2. 若该元素大于其父节点,两个元素互换。(上移操作)
3. 循环第2步,直至该元素没有父节点或小于其父节点。
删除:1. 移掉顶部的节点。
2. 将队末的元素放置到顶部。
3. 该节点与其子节点中较大的那个比较,若小于它,则交换位置,(下移操作)
4. 循环第3步,直到叶节点或不再比其子节点中较大那个小。
多叉树
二叉树中每个结点有一个数据项,最多有两个子结点,如果允许每个结点有多个数据项和多个子结点,那么这个树就是多叉树.
典型的多叉树有2-3-4-Tree, B-Tree.
2-3-4-Tree参考:
http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html
B-Tree系列参考
http://blog.csdn.net/hbhhww/article/details/8206846
--多叉树现在理解有点吃力, 等深入SQL索引再来理解B-tree
二叉树的存储结构一般采用二叉链表,树中每一个结点都有一个数据域data还有两个分别用于指向该节点的左右儿子结点的指针域,通过这两个指针域建立了上下层结点的关系.
二叉树的一些特性就不详细说了,很多资料都有,直接看看典型的二叉树.
二叉查找树
二叉查找树是满足以下条件的二叉树:
1.左子树上的所有节点值均小于根节点值,
2右子树上的所有节点值均不小于根节点值
简单的构造一个二叉查找树
package com.cain.datastructrue; /** * Created by wisdom on 15-10-16. */ public class BinaryTree { BinaryTree tree = new BinaryTree(); private Node root; public BinaryTree() { this.root = null; } private class Node { private int data; private Node left; private Node right; public Node(int data) { this.data = data; this.left = null; this.right = null; } } public void generateTree(Node node, int data) { if (node == null) { root = new Node(data); } else { if (data < node.data) { if (node.left == null) node.left = new Node(data); else generateTree(node.left, data); } else { if (data > node.data) { if (node.right == null) { node.right = new Node(data); } else { generateTree(node.right, data); } } } } } //先序遍历 public void preOrder(Node node) { if (node != null) { System.out.println(node.data); preOrder(node.left); preOrder(node.right); } } public static void main(String[] args) { int[] a = {1, 4, 26, 8, 77, 43, 75}; BinaryTree tree = new BinaryTree(); for (int i = 0; i < a.length; i++) tree.generateTree(tree.root, a[i]); tree.preOrder(tree.root); } }
/*查找一个特定的关键字*
TREE_SEARCH(root,k)
IF root=NIL or k=key[root]
RETURN root;
IF k<key[root]
TREE_SEARCH(left[x],k)
ELSE
TREE_SEARCH(right[x],k)
对一颗高度为H的二叉查找树,动态集合操作search,minnum,maxnum...的时间复杂度都为O(H)
插入,删除等操作复杂一些, 重点在于理解,可以参考: http://www.cnblogs.com/aiyelinglong/archive/2012/03/27/2419972.html
红黑树
二叉搜素树如果插入的是随机数,则执行效果较好,当要插入的是有序的数据(10,23,25,78)那么此时二叉树会成了非平衡二叉树,而对于非平衡二叉树,它的快速查找(插入,删除)能力就丧失了.
红黑树(属于查找二叉树)是一种很有意思的平衡检索树, 简单来讲就是为了避免树的不平衡,增加了颜色这个属性来平衡二叉查找树。
TreeMap就是红黑树实现的;
红黑树旋/颜色变换的实现比较复杂,参考:
http://blog.csdn.net/v_july_v/article/details/6105630
红黑树的效率:
查找时间和普通二叉搜索树几乎完全一样,因为在查找的过程中并没有应用红黑树的特征.只是增加了每一个结点的存储空间来存储颜色;
插入和删除操作和普通的二叉搜索树时间上的开销略有增加,因为要执行颜色变换和旋转.
堆
堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。
具体的原理和实现这个帖子写的比较好,我就省了
/article/3478151.html
堆实现的主要操作就是 插入和 删除(移除并获取那个最符合条件的元素)。先简单描述下逻辑
插入:1. 将新插入的元素,放置到队列的尾部。
2. 若该元素大于其父节点,两个元素互换。(上移操作)
3. 循环第2步,直至该元素没有父节点或小于其父节点。
删除:1. 移掉顶部的节点。
2. 将队末的元素放置到顶部。
3. 该节点与其子节点中较大的那个比较,若小于它,则交换位置,(下移操作)
4. 循环第3步,直到叶节点或不再比其子节点中较大那个小。
多叉树
二叉树中每个结点有一个数据项,最多有两个子结点,如果允许每个结点有多个数据项和多个子结点,那么这个树就是多叉树.
典型的多叉树有2-3-4-Tree, B-Tree.
2-3-4-Tree参考:
http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html
B-Tree系列参考
http://blog.csdn.net/hbhhww/article/details/8206846
--多叉树现在理解有点吃力, 等深入SQL索引再来理解B-tree
相关文章推荐
- 选择排序
- Binary Heap
- 数据结构实验之二叉树五:层序遍历
- HDU 2896 病毒侵袭 (AC自动机)
- 数据结构基础:数组和链表
- HDU 2222 Keywords Search (AC自动机)
- C数据结构学习历程(3) 顺序栈之 一般表达式转化后缀式
- java数据结构
- 【树项目2 - 二叉树遍历的递归算法】
- 【数据结构】寻找2个单链表相同的值
- Binomial Tree & Heap
- 2015年大二上-数据结构-链表(7)-多项式求和
- rn_xtcxyczjh-9 并发[线程5 原子操作(volatile, inline, typeof, ({ep1;ep2;}), 内嵌汇编) 无锁数据结构]
- 05-树7 堆中的路径
- 04-树6 Complete Binary Search Tree
- 数据结构实验一
- UESTC 1132 酱神赏花 (用数据结构优化DP)
- 归并排序
- 堆排序
- 希尔排序