您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础:二叉树,堆,多叉树

2015-11-05 22:19 281 查看
二叉树是综合了数组和链表的优点和缺点(数组插入效率低,链表查找效率低)

二叉树的存储结构一般采用二叉链表,树中每一个结点都有一个数据域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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: