二叉查找树

二叉查找树的结构和普通二叉树相同。它要么是空树,要么满足:对任意结点,如果左子树不为空,则左子树上所有结点的权值都小于该结点的权值;如果右子树不为空,则右子树上所有结点的权值都大于该结点的权值。在二叉查找树中,任意结点的左子树和右子树都是一棵二叉查找树。一般而言,二叉树上结点的权值都是唯一的。

基本操作:

  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 };

 

posted @ 2017-06-18 22:15  NoviScl  阅读(162)  评论(0编辑  收藏  举报