二叉查找树
二叉查找树的结构和普通二叉树相同。它要么是空树,要么满足:对任意结点,如果左子树不为空,则左子树上所有结点的权值都小于该结点的权值;如果右子树不为空,则右子树上所有结点的权值都大于该结点的权值。在二叉查找树中,任意结点的左子树和右子树都是一棵二叉查找树。一般而言,二叉树上结点的权值都是唯一的。
基本操作:
1 //二叉查找树 2 //结点定义 3 template <typename Type> class Node { 4 public: 5 Type data; 6 Node *lchild,*rchild,*parent; 7 //parent is NULL by default 8 Node(Type _data, Node<Type> *_parent=NULL) { 9 data=_data; 10 lchild=NULL; 11 rchild=NULL; 12 parent=_parent; 13 } 14 //no need to delete parent because all nodes are already deleted by delete method recursively 15 ~Node() { 16 if(lchild!=NULL){ 17 delete lchild; 18 } 19 if(rchild!=NULL){ 20 delete rchild; 21 } 22 } 23 24 25 void insert(Type value) { 26 //do not allow repeated element 27 if(data==value){ 28 return; 29 } 30 else if(value>data){ 31 if(rchild==NULL){ 32 rchild=new Node<Type>(value,this); 33 } 34 else{ 35 rchild->insert(value); 36 } 37 } 38 //value<data 39 else{ 40 if(lchild==NULL){ 41 lchild=new Node<Type>(value,this); 42 } 43 else{ 44 lchild->insert(value); 45 } 46 } 47 } 48 49 50 Node* search(Type value) { 51 if(data==value){ 52 return this; 53 } 54 else if(value>data){ 55 if(rchild==NULL){ 56 return NULL; 57 } 58 else{ 59 rchild->search(value); 60 } 61 } 62 //value<data 63 else{ 64 if(lchild==NULL){ 65 return NULL; 66 } 67 else{ 68 lchild->search(value); 69 } 70 } 71 } 72 73 //inorder_print 74 void print() { 75 if(lchild!=NULL){ 76 lchild->print(); 77 } 78 cout<<data<<" "; 79 if(rchild!=NULL){ 80 rchild->print(); 81 } 82 } 83 84 //only for nodes with children 85 Node<Type> * predecessor() { 86 Node<Type> *temp = lchild; 87 //the most right element in its left child tree 88 while (temp != NULL && temp->rchild != NULL) { 89 temp = temp->rchild; 90 } 91 return temp; 92 } 93 94 //only for nodes with children 95 Node<Type> * successor() { 96 Node<Type> *temp = rchild; 97 //the most left elemnent in its right child tree 98 while (temp != NULL && temp->lchild != NULL) { 99 temp = temp->lchild; 100 } 101 return temp; 102 } 103 104 //remove_node for leaf nodes or nodes with only one child 105 void remove_node(Node<Type> *delete_node) { 106 Node<Type> *temp = NULL; 107 if (delete_node->lchild != NULL) { 108 temp = delete_node->lchild; 109 //the successor of delete_node is the father of delete_node 110 temp->father = delete_node->father; 111 } 112 if (delete_node->rchild != NULL) { 113 temp = delete_node->rchild; 114 //the predecessor of delete_node is the father of delete_node 115 temp->father = delete_node->father; 116 } 117 if(delete_node->father!=NULL){ 118 //if delete_node is the left child 119 if (delete_node->father->lchild == delete_node) { 120 delete_node->father->lchild = temp; 121 } else { 122 delete_node->father->rchild = temp; 123 } 124 } 125 //set them to NULL to prevent deleting the entire tree 126 delete_node->lchild = NULL; 127 delete_node->rchild = NULL; 128 delete delete_node; 129 } 130 131 //the complete version of deleting a node 132 //make use of the remove_node method 133 bool delete_node(Type value){ 134 Node<Type> *delete_node,*current_node; 135 //find the target node 136 current_node=search(value); 137 if(current_node==NULL){ 138 return false; 139 } 140 //replacing the current_node with either its predecessor or successor 141 if(current_node->lchild!=NULL){ 142 delete_node=current_node->predecessor(); 143 } 144 else if(current_node->rchild!=NULL){ 145 delete_node=current_node->successor(); 146 } 147 //else it must be a leaf node, which we can just remove it using remove_node 148 else{ 149 delete_node=current_node; 150 } 151 //replace value and delete the predecessor/successor 152 current_node->data=delete_node->data; 153 remove_node(delete_node); 154 return true; 155 } 156 }; 157 158 159 template <typename Type> class BinaryTree { 160 private: 161 Node<Type> *root; 162 public: 163 BinaryTree() { 164 root=NULL; 165 } 166 ~BinaryTree() { 167 delete root; 168 } 169 void insert(Type value) { 170 if(root==NULL){ 171 root=new Node<Type>(value); 172 } 173 else root->insert(value); 174 } 175 bool find(Type value) { 176 if(root==NULL){ 177 return false; 178 } 179 else{ 180 if(root->search(value)==NULL){ 181 return false; 182 } 183 else{ 184 return true; 185 } 186 } 187 } 188 void print() { 189 if(root!=NULL){ 190 root->print(); 191 } 192 } 193 194 bool delete_node(Type value){ 195 if(root==NULL){ 196 return false; 197 } 198 return root->delete_node(value); 199 } 200 };