ひだりへん

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

ひだりへん英語えいごLeftist tree),也可しょうひだりへんうずたかひだり倾堆计算つくえ科学かがくなかてきいちいち优先队列实现方式ほうしきぞくうずたかざいしんいきがくちゅう十分じゅうぶんつね见,ざい统计问题、さい值问题、かたぎ拟问题和贪心问题ひとしとう类型てき题目ちゅうひだりへん树都ゆう广泛てき应用。はすうずたかひだりへん树更为一般的数据结构。

不同ふどうはすうずたかごう并的平均へいきん情況じょうきょう複雜ふくざつえいaverage-case complexity,ひだりへんうずたかてきごう操作そうさてきさい壞情きょう複雜ふくざつえいWorst-case complexity,而完ぜんまたうずたか所以ゆえんひだりへんうずたか适合もと于合并操作そうさてきじょうがた

よし于左へんうずたかやめ经不完全かんぜんまた树,いん不能ふのうようすう组存储表示ひょうじ需要じゅようよう链接结构。

てい[编辑]

ひだりへん树的节点てき距离值

ひだりへん树是いち种可并うずたかてき实现。ひだりへん树是いちまた,它的节点じょりょう二叉树的节点一样具有左右子树ゆび(left, right)そと,还有两个属性ぞくせい: 键值距离(英文えいぶん文献ぶんけん中称ちゅうしょう为s-value)。键值よう于比较节てんてき大小だいしょう。距离てきてい义如

とう且仅とう节点 i てきひだり树或右子ゆうこ树为そら时,节点しょうさくそと节点(实际上保かみのほ存在そんざい二叉树中的节点都是内节点,がい节点逻辑じょう存在そんざい而无需保存ほぞん一颗二叉树补上全部的外节点,则称为extended binary tree)。节点iてき距离节点 i いた它的きさきだいちゅうてき最近さいきんてきそと节点しょ经过てき边数。とく别的,如果节点 i 本身ほんみがい节点,则它てき距离为0;而空节点てき距离规定为 -1。[1]

せい[编辑]

  1. 节点てき键值しょう于或とう于它てき左右さゆう节点てき键值。
  2. 节点てきひだり节点てき距离しょう于右节点てき距离。
  3. 节点てき距离とう于它てき右子ゆうこ节点てき距离1。
  4. いち棵N个节てんてきひだりへん树root节点てき距离最多さいた为log(N+1)-1。

操作そうさ[编辑]

はつはじめ一个左偏树[编辑]

はつはじめひだりへん树有两种方式ほうしき

だい一种是每次选择一个节点与树合并,ちょくいた所有しょゆう节点都合つごう并为いち个树。这种方法ほうほうふと有效ゆうこう,时间复杂

だい种方ほう使用しよう队列はた队列中前ちゅうぜん两个节点あい并,はたごう并后てきしん节点いた队列てき末尾まつびちょくいた队列ちゅうただゆういち个节てん。这种方法ほうほうてき时间复杂

ごう并两颗左へん[编辑]

かり设堆しょううずたかごう并时选择关键较小てき节点さく为根节点,しかきさきはた关键だいてき节点与根よね节点てきみぎうずたかごう并。

ざいごう并之きさき较子うずたかてきs值。つう过交换左右子ゆうこうずたからい证左节点てきs值始终大于等于右节点。しかきさき更新こうしん节点てきs值。

Javaだい码实现合并两棵左へんてき最小さいしょう树:

  1. root键值最小さいしょうてき树的右子ゆうこ树与其它树合并;
  2. うえ步合ぶあい并结はてさく为与root键值最小さいしょう树的右子ゆうこ树。
  3. 较rootてき左右さゆう树的距离值(s-value),如果右子ゆうこ树大于左树则交换两棵
public Node merge(Node x, Node y) {
  if(x == null)
    return y;
  if(y == null) 
    return x;

  // if this was a max height biased leftist tree, then the 
  // next line would be: if(x.element < y.element)
  if(x.element.compareTo(y.element) > 0) {  
    // x.element > y.element
    Node temp = x;
    x = y;
    y = temp;
  }

  x.rightChild = merge(x.rightChild, y);

  if(x.leftChild == null) {
    // left child doesn't exist, so move right child to the left side
    x.leftChild = x.rightChild;
    x.rightChild = null;

  } else {
    // left child does exist, so compare s-values
    if(x.leftChild.s < x.rightChild.s) {
      Node temp = x.leftChild;
      x.leftChild = x.rightChild;
      x.rightChild = temp;
    }
    // since we know the right child has the lower s-value, we can just
    // add one to its s-value
    x.s = x.rightChild.s + 1;
  }
  return x;
}

其他操作そうさ[编辑]

增加ぞうかいち个节てん、删除节点、はつはじめいち批数すえみやこただしもと于合并操作そうさ

参考さんこう文献ぶんけん[编辑]

  1. ^ ひだりへん树的とくてん及其应用》源河げんが2005全国ぜんこく青少年せいしょうねんしんいきがくおくりんひきかつ竞赛ふゆれい国家こっかしゅう训队论文

延伸えんしん阅读[编辑]

  • Leftist Trees页面そん档备份そん互联网档あん), Sartaj Sahni
  • でん清祥せいしょう,おう晓东 算法さんぽうあずかかずすえ结构(だいはん) 电子こう出版しゅっぱんしゃ
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein Introduction to Algorithms (Second Edition) The MIT Press
  • Mark Allen Weiss Data Structures and Algorithm Analysis in C (Second Edition) Pearson Education