斜堆,斜堆scoi

來源:互聯網
上載者:User

斜堆,斜堆scoi

斜堆和左式堆的區別是,左式堆只有在右孩子的npl大於左孩子的npl時,交換兩個孩子的位置,而斜堆是無論如何都交換:

package com.iflytek.heap;/** * 斜堆 * @author fgtian * */public class SkewHeap {public static class HeapNode {int mValue;int mNpl = 0;HeapNode mLeftChild;HeapNode mRightChild;}HeapNode mRoot = null;public void insert(int value) {HeapNode node = new HeapNode();node.mValue = value;merge(node);}public int delMin() {if (null == mRoot) {throw new NullPointerException("null == mRoot");}int value = mRoot.mValue;mRoot = merge(mRoot.mLeftChild, mRoot.mRightChild);return value;}public void merge(HeapNode node) {mRoot = merge(mRoot, node);HeapNode l = mRoot.mLeftChild;mRoot.mLeftChild = mRoot.mRightChild;mRoot.mRightChild = l;mRoot.mNpl = Math.min(npl(mRoot.mLeftChild), npl(mRoot.mRightChild)) + 1;}public void merge(SkewHeap heap) {merge(heap.mRoot);}public static int npl(HeapNode h) {if (null == h) {return -1;}return h.mNpl;}public static HeapNode merge(HeapNode h1, HeapNode h2) {if (null == h1) {return h2;} else if (h2 == null) {return h1;} else { // 兩個都不是nullint v1 = h1.mValue;int v2 = h2.mValue;if (v1 <= v2) { // 拿他的h1.mRightChild = merge(h1.mRightChild, h2);HeapNode node = h1.mLeftChild;h1.mLeftChild = h1.mRightChild;h1.mRightChild = node;h1.mNpl = Math.min(npl(h1.mLeftChild), npl(h1.mRightChild)) + 1;return h1;} else {h2.mRightChild = merge(h1, h2.mRightChild);HeapNode node = h2.mLeftChild;h2.mLeftChild = h2.mRightChild;h2.mRightChild = node;h2.mNpl = Math.min(npl(h2.mLeftChild), npl(h2.mRightChild)) + 1;return h2;}}}}



資料結構中左式堆與斜堆不同是什?詳細的有加分

左式堆學習
部落格分類: 資料結構
演算法資料結構
今天學習了一下左式堆,總結一下。

一、左式堆定義:

具有,如下性質

1、父節點屬性值小於子節點屬性值;

2、堆中的任何節點,其左兒子的零路徑長>=右兒子的零路徑長;

的二叉樹。

註:零路徑長(npl)是指:從一個節點X開始到一個不具有兩個兒子的Y節點的最短路徑的長,可以看出有0個或者一個兒子的節點的npl=0,並且定義npl(null)=-1;

二、左式對的節點定義:

Java代碼
class Node<T> {

// 元素
T element;
// 左節點
Node<T> left;
// 右節點
Node<T> right;
// 零路徑長
int npl;

public Node(T element) {
this(element, null, null);
}

public Node(T element, Node<T> left, Node<T> right) {
this.element = element;
this.left = left;
this.right = right;
this.npl = 0;
}
}

class Node<T> {

// 元素
T element;
// 左節點
Node<T> left;
// 右節點
Node<T> right;
// 零路徑長
int npl;

public Node(T element) {
this(element, null, null);
}

public Node(T element, Node<T> left, Node<T> right) {
this.element = element;
this.left = left;
this.right = right;
this.npl = 0;
}
} 三、左式對的操作:

對於左式堆主要操作是“合并”,因為合并會破壞左式堆的特性,而insert、delete等操作,都會涉及到堆的合并,例如:delete根節點,相當於將一棵樹邊為了兩個樹,在將兩棵樹合并為一棵樹。這裡我們使用了一種遞迴的思想,若h1,h2本身是左式堆,則其子樹也一定是左式堆,其子樹的子樹也一定是左式堆,一直退到樹的每個葉子節點,都符合這個規則,那麼我們合并時就可以從反方向思考,先形成一個個的小左式堆,然後在形成一棵大的左式堆。

四、左式堆定義代碼:

Java代碼
public class LeftistHeap<T extends Comparable<T>> { ......餘下全文>>
 
資料結構中左式堆與斜堆不同是什?詳細的有加分

左式堆學習
部落格分類: 資料結構
演算法資料結構
今天學習了一下左式堆,總結一下。

一、左式堆定義:

具有,如下性質

1、父節點屬性值小於子節點屬性值;

2、堆中的任何節點,其左兒子的零路徑長>=右兒子的零路徑長;

的二叉樹。

註:零路徑長(npl)是指:從一個節點X開始到一個不具有兩個兒子的Y節點的最短路徑的長,可以看出有0個或者一個兒子的節點的npl=0,並且定義npl(null)=-1;

二、左式對的節點定義:

Java代碼
class Node<T> {

// 元素
T element;
// 左節點
Node<T> left;
// 右節點
Node<T> right;
// 零路徑長
int npl;

public Node(T element) {
this(element, null, null);
}

public Node(T element, Node<T> left, Node<T> right) {
this.element = element;
this.left = left;
this.right = right;
this.npl = 0;
}
}

class Node<T> {

// 元素
T element;
// 左節點
Node<T> left;
// 右節點
Node<T> right;
// 零路徑長
int npl;

public Node(T element) {
this(element, null, null);
}

public Node(T element, Node<T> left, Node<T> right) {
this.element = element;
this.left = left;
this.right = right;
this.npl = 0;
}
} 三、左式對的操作:

對於左式堆主要操作是“合并”,因為合并會破壞左式堆的特性,而insert、delete等操作,都會涉及到堆的合并,例如:delete根節點,相當於將一棵樹邊為了兩個樹,在將兩棵樹合并為一棵樹。這裡我們使用了一種遞迴的思想,若h1,h2本身是左式堆,則其子樹也一定是左式堆,其子樹的子樹也一定是左式堆,一直退到樹的每個葉子節點,都符合這個規則,那麼我們合并時就可以從反方向思考,先形成一個個的小左式堆,然後在形成一棵大的左式堆。

四、左式堆定義代碼:

Java代碼
public class LeftistHeap<T extends Comparable<T>> { ......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.