二叉查找树

Posted NoviScl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉查找树相关的知识,希望对你有一定的参考价值。

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

基本操作:

  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 
     //only for nodes with children 84 Node<Type> * predecessor() { 85 Node<Type> *temp = lchild; 86 //the most right element in its left child tree 87 while (temp != NULL && temp->rchild != NULL) { 88 temp = temp->rchild; 89 } 90 return temp; 91 } 92
     //only for nodes with children 93 Node<Type> * successor() { 94 Node<Type> *temp = rchild; 95 //the most left elemnent in its right child tree 96 while (temp != NULL && temp->lchild != NULL) { 97 temp = temp->lchild; 98 } 99 return temp; 100 } 101 102 //remove_node for leaf nodes or nodes with only one child 103 void remove_node(Node<Type> *delete_node) { 104 Node<Type> *temp = NULL; 105 if (delete_node->lchild != NULL) { 106 temp = delete_node->lchild; 107 //the successor of delete_node is the father of delete_node 108 temp->father = delete_node->father; 109 } 110 if (delete_node->rchild != NULL) { 111 temp = delete_node->rchild; 112 //the predecessor of delete_node is the father of delete_node 113 temp->father = delete_node->father; 114 } 115 //if delete_node is the left child 116 if (delete_node->father->lchild == delete_node) { 117 delete_node->father->lchild = temp; 118 } else { 119 delete_node->father->rchild = temp; 120 } 121 //set them to NULL to prevent deleting the entire tree 122 delete_node->lchild = NULL; 123 delete_node->rchild = NULL; 124 delete delete_node; 125 } 126 127 //the complete version of deleting a node 128 //make use of the remove_node method 129 bool delete_node(Type value){ 130 Node<Type> *delete_node,*current_node; 131 //find the target node 132 current_node=search(value); 133 if(current_node==NULL){ 134 return false; 135 } 136 //replacing the current_node with either its predecessor or successor 137 if(current_node->lchild!=NULL){ 138 delete_node=current_node->predecessor(); 139 } 140 else if(current_node->rchild!=NULL){ 141 delete_node=current_node->successor(); 142 } 143 //else it must be a leaf node, which we can just remove it using remove_node 144 else{ 145 delete_node=current_node; 146 } 147 //replace value and delete the predecessor/successor 148 current_node->data=delete_node->data; 149 remove_node(delete_node); 150 return true; 151 } 152 }; 153 154 155 template <typename Type> class BinaryTree { 156 private: 157 Node<Type> *root; 158 public: 159 BinaryTree() { 160 root=NULL; 161 } 162 ~BinaryTree() { 163 delete root; 164 } 165 void insert(Type value) { 166 if(root==NULL){ 167 root=new Node<Type>(value); 168 } 169 else root->insert(value); 170 } 171 bool find(Type value) { 172 if(root==NULL){ 173 return false; 174 } 175 else{ 176 if(root->search(value)==NULL){ 177 return false; 178 } 179 else{ 180 return true; 181 } 182 } 183 } 184 void print() { 185 if(root!=NULL){ 186 root->print(); 187 } 188 } 189 190 bool delete_node(Type value){ 191 if(root==NULL){ 192 return false; 193 } 194 return root->delete_node(value); 195 } 196 };

 

以上是关于二叉查找树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 动态查找与二叉排序树

二叉查找树

PHP 二叉查找树(二叉搜索树)的查找

C++-二叉搜索树的查找&插入&删除-二叉搜索树代码实现-二叉搜索树性能分析及解决方案

二叉查找树 - 删除查找

数据结构中,怎么写二叉树查找双亲的伪代码?急!