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

二叉树是综合了数组和链表的优点和缺点(数组插入效率低,链表查找效率低)

二叉树的存储结构一般采用二叉链表,树中每一个结点都有一个数据域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

 

红黑树的效率:  

     查找时间和普通二叉搜索树几乎完全一样,因为在查找的过程中并没有应用红黑树的特征.只是增加了每一个结点的存储空间来存储颜色; 

     插入和删除操作和普通的二叉搜索树时间上的开销略有增加,因为要执行颜色变换和旋转.


堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。

具体的原理和实现这个帖子写的比较好,我就省了

http://my.oschina.net/BreathL/blog/71602


 堆实现的主要操作就是 插入和 删除(移除并获取那个最符合条件的元素)。先简单描述下逻辑

     插入: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值