1.51k likes | 1.71k Views
Chapter 12. Tree Maps and Tree Sets. Chap.12 Contents. 12.1 Red-Black Trees 12.1.1 The Height of a Red-Black Tree 12.1.2 Red-Black Tree Insertion 12.2 The Map Interface 12.3 The TreeMap Implementation of the SortedMap Interface
E N D
Chapter 12 Tree Maps and Tree Sets
Chap.12 Contents 12.1 Red-Black Trees 12.1.1 The Height of a Red-Black Tree 12.1.2 Red-Black Tree Insertion 12.2 The Map Interface 12.3 The TreeMap Implementation of the SortedMap Interface 12.3.1 The TreeMap Class’s Fields and Nested Entry Class 12.3.2 Method Definitions in the TreeMap Class
Chap.12 Contents (cont.) 12.4 Application of the TreeMap Class: A Simple Thesaurus 12.4.1 Design and Implementation of the Thesaurus Class 12.6 The Tree Set Class 12.6.1 Implementation of the TreeSet Class 12.6.2 Application: A Simple Spell Checker
Red-black tree 特性 • 如果黑元素只有一個子元素, 則此子元素必為紅leaf • 如果紅元素有子元素, 則必定是兩個黑色子元素 Why? See next page.
Answers • 有兩 paths 經此黑元素 1) 其一到此為止 2) 另一到此又到其子 其子須為紅元素 此兩 paths 才會有相同數目的黑元素 才符合 path rule • 經此紅元素 有兩 paths 到其二子 此二子須為黑元素 此兩 paths 才會有相同數目的黑元素 才符合 path rule 而且 若子為紅 則紅紅 不符 red rule
12.1.2 Red-Black Tree Insertion 我們要對左圖 insert 2 1)依 binary search tree 把 2 當 1 的 right child 2)依 red black tree 新加入者為red 故 1,2形成右圖 Double Red違反 Red Rule 3 3 1 4 4 1 2
How to do 3 Cases of Double Red? Case 1: Red uncle new nodeRecurse upwards if Double Red grandparent 3 3 uncle uncle parent 1 4 1 4 node node can be left child too 2 2 • recolor parent and uncle to BLACK • recolor grandparent to RED • node 3 as new node • if Double Red again then recurse upwards
Case 2: Black uncle, LR (3,1,2) 3 3 1. rotateLeft (1) 2. node 1as new node 3. goto Case 3 uncle uncle 4 2 4 1 node new node 2 1
Case 3: Black uncle, LL (3,2,1) 1. rotateRight (3) 2. recolor 2 to BLACK 3. recolor 3 to RED 3 2 uncle 4 2 3 1 node uncle node 4 1
以上 3 cases 是 parent isleft child 另有左右對調的 3 cases 是 parent isright child 請自行畫圖 依照這些 design sketch 可推敲出 pseudo-code 如下
Copy right: MIT Erik D. Demaine & Leiserson // x= node (Red Rule)
RBT.EntryRBTinsert(aRoot, node) // red black tree (RBT) insert • // aRoot is the current RBT’s root before insertion. • // node is the node to be inserted. • 1. root = (RBT.Entry)BST.BSTinsert (aRoot, node)// binary search tree (BST) insert • 2. node <- RED • 3. while nodeis not root AND parent is RED • if parent is left child then • 1. uncle <- right child of grandparent • 2. if uncle is REDthen 〈Case 1〉 • else • 1. if node is right child then〈Case 2〉end if • 2.〈Case 3〉 • end if • else〈parent is right child 上面紅色部分中 ”left” 與 “right”對調〉 • end if • end while • 4. root <- BLACK • 5. return root • end RBTinsert
60 80 30 50 70 90 20 40 剛加的必為紅元素Case 1