ホームページ > Java > &#&チュートリアル > Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

WBOY
リリース: 2023-04-24 22:46:06
転載
1282 人が閲覧しました

ビッグ ルート ヒープ

ビッグ ルート ヒープ: 各ノードの値は親ノードの値より大きくありません

分析は次のとおりです:

このようなセット {27,15,19,18,28,34,65,49,25,37};

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法 のようなデータの山が作成されたとします。

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法

Java で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法##コードは次のとおりです:

//建立大根堆
public class TestHeap{
    public int[] array;
    public int usedSize;//当前有效数组长度
    public TestHeap(){
        this.array = new int[10];
        this.usedSize = 0;
    }
    //初始化数组
    public void InitArray(int[] arrayClone){
        array = Arrays.copyOf(arrayClone, arrayClone.length);
        usedSize = array.length;
    }
    //创建大根堆
    public void createHeap(){
        for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){
            adjustment(parent, usedSize);
        }
    }
    //调整
    public void adjustment(int parent, int len){
        //左子树结点下标
        int child = parent * 2 + 1;
        //调整
        while(child < len){
            //先判断有没有右孩子,如果右,找出最大值
            if(child + 1 < len && array[child] < array[child + 1]){
                child++;//如果右子树大,child++就指向他,如果左子树大,就不用管,直接进行下一步判断交换
            }
            //若左右子树的最大值大于父亲结点则交换
            if(array[child] > array[parent]){
                swap(array, child, parent);
                parent = child;
                child = parent * 2 + 1;
            } else{
                break;
            }
        }
    }
    //交换
    public void swap(int[] array, int child, int parent){
        int tmp = array[child];
        array[child] = array[parent];
        array[parent] = tmp;
    }
}
ログイン後にコピー

小さなルート ヒープ

小さなルート ヒープ: 各ノードの値は以上です親ノードの値

分析は、小さいルート ヒープが比較され置き換えられる点を除いて、大きなルート ヒープと似ています。

コードは次のとおりです:

//建立大根堆
public class TestHeap{
    public int[] array;
    public int usedSize;//当前有效数组长度
    public TestHeap(){
        this.array = new int[10];
        this.usedSize = 0;
    }
    //初始化数组
    public void InitArray(int[] arrayClone){
        array = Arrays.copyOf(arrayClone, arrayClone.length);
        usedSize = array.length;
    }
    //创建大根堆
    public void createHeap(){
        for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){
            adjustment(parent, usedSize);
        }
    }
    //调整
    public void adjustment(int parent, int len){
        //左子树结点下标
        int child = parent * 2 + 1;
        //调整
        while(child < len){
            //先判断有没有右孩子,如果右,找出最小值
            if(child + 1 < len && array[child] > array[child + 1]){
                child++;//如果右子树小,child++就指向他,如果左子树小,就不用管,直接进行下一步判断交换
            }
            //若左右子树的最大值小于父亲结点则交换
            if(array[child] < array[parent]){
                swap(array, child, parent);
                parent = child;
                child = parent * 2 + 1;
            } else{
                break;
            }
        }
    }
    //交换
    public void swap(int[] array, int child, int parent){
        int tmp = array[child];
        array[child] = array[parent];
        array[parent] = tmp;
    }
}
ログイン後にコピー

以上がJava で完全なバイナリ ツリーを使用して大きなルート ヒープと小さなルート ヒープを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート