資料結構之 伸展樹個人筆記 伸展樹(一)之 圖文解析 和 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的右子樹的某個節點上,那麼你就需要將右子樹旋轉直到根節點上。那麼根據生活常識,你需要向左旋轉才能將右子樹旋轉到根節點上。右旋同理之。
而所謂的左旋、右旋,則相當於;
左旋:將節點旋轉為右孩子的左節點
右旋:將節點旋轉為左孩子的右節點