大頂堆

今天學了一波數據結構,看到一段非常神奇的代碼,於是模仿了一下。

package big;
/**
 * 一個大頂堆
 * @author hanhe
 *
 */
public class Stack {
    int size;
    int data[];
    int maxSize;

    public Stack()
    {
        maxSize=50;
        size=0;
        data=new int[maxSize];
        data[0]=Integer.MAX_VALUE;
    }
    public Stack(int maxSize)
    {
        this.maxSize=maxSize;
        size=0;
        data=new int[maxSize];
        data[0]=Integer.MAX_VALUE;   
    }

    /**
     * 判斷當前堆是否爲空
     * @return 爲空時返回true,否則返回false
     */
    public boolean isEmpty()
    {
        if(size==0)
            return true;
        return false;
    }
    public boolean isFull()
    {
        if(size==maxSize)
            return true;
        return false;
    }
    /**
     * 插入一個值
     * @param value 
     */
    public void insert(int value)
    {
        if(isFull())
            return;
        int i=(++size);

        for(;value>data[(int)(i/2)];i/=2)
        {
            data[i]=data[(int)(i/2)];
        }
        data[i]=value;
    }

    /**
     * 取出最大值
     * @return 返回當前堆內的最大值
     */
    public int deleteMax()
    {
        if(this.isEmpty())
            return -1;
        int parent,child;
        int maxItem,temp;

        //數組中的第一個值是當前堆內的最大值
        maxItem=this.data[1];

        //tmp保存當前堆內的之後一個值
        temp=this.data[this.size--];

        /*
         *以下是這段代碼的精華部分,用精妙的代碼完成大頂堆的轉換 
         */

        //parent>=size時,說明當前節點已沒有子樹
        for(parent=1;parent*2<=this.size;parent=child)
        {
            //使child指向左子樹
            child=parent*2;
            //如果左子樹等於size說明不存在右子樹,如果右子樹的值大於左子樹的值則讓child指向右子樹
            if((child!=this.size) && this.data[child]<this.data[child+1])
                child++;
            //如果最後一個節點的值大於子樹的值則移動完成,否則用子樹的值作爲堆頂,將最後的值,與子樹的值交換
            if(temp>=this.data[child]) break;
            else    
                this.data[parent]=this.data[child];
        }
        //將最後的值放到指定位置
        this.data[parent]=temp;

        return maxItem;
    }

    public void dfs(int n)
    {
        if(n>size)
            return;
        System.out.println(data[n]);
        dfs(n*2);
        dfs(n*2+1);
    }

    public void print()
    {
        for(int i=1;i<=size;++i)
            System.out.print(data[i]+" ");
        System.out.println();
    }
    public static void main(String args[])
    {
        Stack s=new Stack();

        s.insert(10);
        s.insert(15);
        s.insert(4);

        while(!s.isEmpty())
        {
            System.out.println(s.deleteMax());
        }
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章