1. 程式人生 > >資料結構之 伸展樹個人筆記 伸展樹(一)之 圖文解析 和 C語言的實現

資料結構之 伸展樹個人筆記 伸展樹(一)之 圖文解析 和 C語言的實現

閱讀了skywang的伸展樹的講解,覺得講的很不錯,再次也推薦大家無論是新手還是老手都可以去閱讀下。

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

伸展樹(一)之 圖文解析 和 C語言的實現

概要

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

目錄
1. 伸展樹的介紹
2. 伸展樹的C實現
3. 伸展樹的C測試程式

轉載請註明出處:http://www.cnblogs.com/skywang12345/p/3604238.html

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

特性要點:

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的右子樹的某個節點上,那麼你就需要將右子樹旋轉直到根節點上。那麼根據生活常識,你需要向左旋轉才能將右子樹旋轉到根節點上。右旋同理之。

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

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

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

 

 

概要

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

目錄
1. 伸展樹的介紹
2. 伸展樹的C實現
3. 伸展樹的C測試程式

轉載請註明出處:http://www.cnblogs.com/skywang12345/p/3604238.html

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

特性要點:

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的右子樹的某個節點上,那麼你就需要將右子樹旋轉直到根節點上。那麼根據生活常識,你需要向左旋轉才能將右子樹旋轉到根節點上。右旋同理之。

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

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

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