1. 程式人生 > >資料結構之 伸展樹個人筆記

資料結構之 伸展樹個人筆記

概要

本章介紹伸展樹。它和"二叉查詢樹"和"AVL樹"一樣,都是特殊的二叉樹。在瞭解了"二叉查詢樹"和"AVL樹"之後,學習伸展樹是一件相當容易的事情。和以往一樣,本文會先對伸展樹的理論知識進行簡單介紹,然後給出C語言的實現。後序再分別給出C++和Java版本的實現;這3種實現方式的原理都一樣,選擇其中之一進行了解即可。若文章有錯誤或不足的地方,希望您能不吝指出!

---------------------------------------------------------------------------------------------

特性要點:

1.如果尋找的key值小於tree->key值的話,則進行右旋:

 1 Node N, *l, *r, *c;
 2 
 3 N.left = N.right = NULL;
 4 l = r = &N;
 5 if(key < tree->key)
 6 {
 7   if(key< tree->left->key)
 8   {
 9            c = tree -> left;
10            tree->left = c->right;
11            c->right = tree;
12            tree = c;        
13
  } 14 r->left = tree; /* 02, link right */ 15 r = tree; 16 tree = tree->left; 17 }

2.尋找的key值大於tree->key的話,則左旋,同理之;

3.如何簡單的判斷左旋還是右旋:

  因為伸展樹就是為了將尋找的key值對應的節點變為根節點,所以根據二叉樹的特性:x節點包含關鍵字key,如果y是x的左子樹的一個節點,則 key[y]<= key[x]。如果y是x的右子樹的一個節點,則key[y] >= key[x]。那麼如果key > tree->key ,則key就在tree的右子樹的某個節點上,那麼你就需要將右子樹旋轉直到根節點上。那麼根據生活常識,你需要向左旋轉才能將右子樹旋轉到根節點上。右旋同理之。

而所謂的左旋、右旋,則相當於;

左旋:將節點旋轉為右孩子的左節點

右旋:將節點旋轉為左孩子的右節點