首页 > 其他 > 详细

BinarySearchTree二叉搜索树的实现

时间:2015-11-06 11:17:48      阅读:220      评论:0      收藏:0      [点我收藏+]
  1 // BinarySearchTree.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 
  7 using std::cin;
  8 using std::cout;
  9 using std::endl;
 10 
 11 struct BinarySearchTreeNode{
 12     int key;
 13     BinarySearchTreeNode *parent;
 14     BinarySearchTreeNode *left;
 15     BinarySearchTreeNode *right;
 16 };
 17 
 18 struct BinarySearchTree{
 19     BinarySearchTreeNode *root;
 20     int nodes;
 21 };
 22 
 23 void initeTree(BinarySearchTree &T)
 24 {
 25     T.root = nullptr;
 26     T.nodes = 0;
 27 }
 28 
 29 void allocateNodeSpace(BinarySearchTreeNode **node)
 30 {
 31     *node = (BinarySearchTreeNode *)malloc(sizeof(BinarySearchTreeNode));
 32     if (*node == NULL)
 33         cout << "allocte space error!"<<endl;
 34     else
 35     {
 36         (*node)->left = nullptr;
 37         (*node)->right = nullptr;
 38         (*node)->parent = nullptr;
 39         (*node)->key = 0;
 40     }
 41 }
 42 
 43 
 44 
 45 void inorderVisit(BinarySearchTreeNode *node)
 46 {
 47     if (node != nullptr)
 48     {
 49         inorderVisit(node->left);
 50         cout << node->key <<  ;
 51         inorderVisit(node->right);
 52     }
 53 }
 54 
 55 //递归实现
 56 BinarySearchTreeNode &searchOneNode(BinarySearchTreeNode* node,int key)
 57 {
 58     if (node == nullptr || node->key == key)
 59         return *node;
 60     if (node->key < key)
 61         return searchOneNode(node->right, key);
 62     else
 63         return searchOneNode(node->left,key);
 64         
 65 }
 66 
 67 //迭代实现
 68 BinarySearchTreeNode &searchOneNode1(BinarySearchTreeNode* node, int key)
 69 {
 70     while (node != nullptr && key != node->key)
 71     {
 72         if (node->key < key)
 73             node = node->right;
 74         else
 75             node = node->left;
 76     }
 77     return *node;
 78 }
 79 
 80 //查找某个结点子树中的最小元素
 81 BinarySearchTreeNode & findMinmum(BinarySearchTreeNode *node)
 82 {
 83     while (node->left != nullptr)
 84     {
 85         node = node->left;
 86     }
 87     return *node;
 88 }
 89 
 90 //查找某个结点子树中的最大元素
 91 BinarySearchTreeNode & findMaxmum(BinarySearchTreeNode *node)
 92 {
 93     while (node->right != nullptr)
 94     {
 95         node = node->right;
 96     }
 97     return *node;
 98 }
 99 
100 //获取一个结点的后继
101 BinarySearchTreeNode & getNodeSuccessor(BinarySearchTreeNode *node)
102 {
103     BinarySearchTreeNode *ptr = nullptr;
104     ptr = node->right;
105     while (ptr != nullptr && ptr->left != nullptr)
106     {
107         ptr = ptr->left;
108     }
109     if (ptr == nullptr)
110         ptr = node->parent;
111     return *ptr;
112 }
113 
114 //建立一棵二叉搜索树,即向二叉搜索树中增加结点
115 void inserTreeNode(BinarySearchTree &T,BinarySearchTreeNode *node)
116 {
117     BinarySearchTreeNode *parentPtr = nullptr;
118     BinarySearchTreeNode *temPtr = T.root;
119     while (temPtr != nullptr)
120     {
121         parentPtr = temPtr;
122         if (node->key < temPtr->key)
123             temPtr = temPtr->left;
124         else
125             temPtr = temPtr->right;
126     }
127     node->parent = parentPtr;
128     if (parentPtr == nullptr)
129         T.root = node;
130     else if (node->key < parentPtr->key)
131         parentPtr->left = node;
132     else
133         parentPtr->right = node;
134 }
135 
136 //建立一棵二叉搜索树,即
137 void createTree(BinarySearchTree &T)
138 {
139     int key = -1;
140     BinarySearchTreeNode *temNode = nullptr;
141     while (cin>>key,key!=-1)
142     {
143 
144         allocateNodeSpace(&temNode);
145         temNode->key = key;
146         inserTreeNode(T,temNode);
147     }
148 }
149 
150 //用一棵子树v替换另一棵子树u并成为其(u)双亲的孩子结点。
151 void transplantUV(BinarySearchTree &T,BinarySearchTreeNode *u, BinarySearchTreeNode *v)
152 {
153     if (u->parent == nullptr)
154         T.root = v;
155     else if (u == u->parent->left)
156         u->parent->left = v;
157     else
158         u->parent->right = v;
159     if (v != nullptr)
160         v->parent = u->parent;
161 }
162 //从二叉搜索树中删除一个结点
163 /*
164 从一棵二叉搜索树中删除一个结点node,可以分为三种情况:
165 1)如果node没有孩子结点,那么可以直接删除该结点;
166 2)如果node只有一个孩子结点,那么就让该孩子结点取代node的位置;
167 3)如果node有两个孩子结点,那么找到node的后继结点afterNode(一定在node的右子树中),并让afterNode取代node的位置。
168 并让node原来的右子树成为afterNode新的右子树,node的左子树成为afterNode的左子树。
169 对于情况3)又可以分为两种情况:
170 3.1)afterNode是node的右孩子,那么直接让afterNode取代node的位置,不做其它变换。
171 3.2)afterNode是node的右子树中的左子树的一个结点,但不是node的右孩子,那么先让afterNode的右孩子取代afterNode的位置,
172 然后让afterNode取代node的位置,并让node的右子树成为afterNode新的右子树。
173 */
174 void deleteTreeNode(BinarySearchTree &T, int key)
175 {
176     BinarySearchTreeNode *node = &searchOneNode1(T.root,key);
177     if (node->left == nullptr)
178         transplantUV(T, node, node->right);
179     else if (node->right == nullptr)
180         transplantUV(T,node,node->left);
181     else
182     {
183         BinarySearchTreeNode *temPtr = &findMinmum(node->right);
184         if (temPtr->parent != node)
185         {
186             transplantUV(T,temPtr,temPtr->right);
187             temPtr->right = node->right;
188             temPtr->right->parent = temPtr;
189         }
190         transplantUV(T, node, temPtr);
191         temPtr->left = node->left;
192         node->left->parent = temPtr;
193     }
194     free(node);
195 }
196 
197 void main(void)
198 {
199     cout << "1.首先构建一棵二叉搜索树:" << endl;
200     BinarySearchTree T;
201     initeTree(T);
202     createTree(T);
203     cout << "2.中序遍历二叉搜索树:" << endl;
204     inorderVisit(T.root);
205     //cout << endl;
206     //cout << "3.输入出一个结点的后继结点:" << endl;
207     //cout << "请输入要查找的结点的关键字Key:" << endl;
208     //int keyValue;
209     //cin >> keyValue;
210     //BinarySearchTreeNode *temPtr = &searchOneNode1(T.root,keyValue);
211     //BinarySearchTreeNode *successorPtr = &getNodeSuccessor(temPtr);
212     //cout << successorPtr->key;
213     //cout << "请输入要删除的结点的关键字:" << endl;
214     //cin >> keyValue;
215     int keyValue;
216     cin >> keyValue;
217     deleteTreeNode(T, keyValue);
218     inorderVisit(T.root);
219 }

 

BinarySearchTree二叉搜索树的实现

原文:http://www.cnblogs.com/tgycoder/p/4941883.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!