demo代码如下。欢迎指正与讨论。
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
template <typename T>
struct BinaryNode{
T elem;
BinaryNode *left;
BinaryNode * right;
BinaryNode(T d, BinaryNode *l=NULL, BinaryNode *r=NULL):elem(d),left(l),right(r){};
};
BinaryNode<int> * constructTestingTree(){
BinaryNode<int> * leaf24 = new BinaryNode<int>(24);
BinaryNode<int> * leaf23 = new BinaryNode<int>(23);
BinaryNode<int> * leaf22 = new BinaryNode<int>(22);
BinaryNode<int> * leaf21 = new BinaryNode<int>(21);
BinaryNode<int> * leaf12 = new BinaryNode<int>(12, leaf23, leaf24);
BinaryNode<int> * leaf11 = new BinaryNode<int>(11, leaf21, leaf22);
BinaryNode<int> * root = new BinaryNode<int>(0, leaf11, leaf12);
return root;
}
BinaryNode<int> * constructSearchTree(){
BinaryNode<int> * leaf24 = new BinaryNode<int>(8);
BinaryNode<int> * leaf23 = new BinaryNode<int>(6);
BinaryNode<int> * leaf22 = new BinaryNode<int>(4);
BinaryNode<int> * leaf21 = new BinaryNode<int>(1);
BinaryNode<int> * leaf12 = new BinaryNode<int>(7, leaf23, leaf24);
BinaryNode<int> * leaf11 = new BinaryNode<int>(3, leaf21, leaf22);
BinaryNode<int> * root = new BinaryNode<int>(5, leaf11, leaf12);
return root;
}
////////////////
///////basic operation
void inorderTraversal_recursive(BinaryNode<int> * root){
if(root == NULL)
return;
inorderTraversal_recursive(root -> left);
cout << root -> elem << endl;
inorderTraversal_recursive(root -> right);
}
void preorderTraversal_recursive(BinaryNode<int> * root){
if(root == NULL)
return;
cout << root -> elem << endl;
preorderTraversal_recursive(root -> left);
preorderTraversal_recursive(root -> right);
}
void preorderTraversal_stack(BinaryNode<int> * root){
stack<BinaryNode<int> *> s;
s.push(root);
while(!s.empty() ){
BinaryNode<int> * temp = s.top();
s.pop();
cout << temp -> elem << endl;
if(temp -> right != NULL)
s.push(temp -> right);
if(temp -> left != NULL)
s.push(temp -> left);
}
}
void postorderTraversal_recursive(BinaryNode<int> * root){
if(root == NULL)
return;
postorderTraversal_recursive(root -> left);
postorderTraversal_recursive(root -> right);
cout << root -> elem << endl;
}
void levelTraversal(BinaryNode<int> * root){
queue<BinaryNode<int> *> q;
q.push(root);
while(!q.empty()){
BinaryNode<int> * temp = q.front();
q.pop();
cout << temp -> elem << endl;
if(temp -> left != NULL)
q.push(temp -> left);
if(temp -> right != NULL)
q.push(temp -> right);
}
}
/////////////////////////////
//////search tree
BinaryNode<int> * search(BinaryNode<int> * root, int key){
if(root == NULL)
return NULL;
else if(root -> elem == key)
return root;
else{
if(root -> left != NULL && root -> elem > key)
return search(root -> left, key);
else if(root -> right != NULL && root -> elem < key)
return search(root -> right, key);
else
return NULL;
}
}
void insert(BinaryNode<int> * & root, int key){
if(root == NULL){
root = new BinaryNode<int>(key);
return;
}
else{
if(key > root -> elem)
insert(root->right, key);
else if(key < root -> elem)
insert(root->left, key);
}
}
BinaryNode<int> * largest(BinaryNode<int> * &root){
if(root -> right == NULL)
return root;
else
largest(root -> right);
}
BinaryNode<int> * largestFather(BinaryNode<int> * &root){
if(root -> right -> right == NULL)
return root;
else
largest(root -> right);
}
void deleteThis(BinaryNode<int> * & root){
if(root -> left == NULL && root -> right == NULL){
//delete root;
root = NULL;
}
else if(root -> left == NULL && root -> right != NULL )
root = root -> right;
else if(root -> left != NULL && root -> right == NULL)
root = root -> left;
else{
BinaryNode<int> * large = largest(root -> left);
BinaryNode<int> * largeFather = largestFather(root -> left);
root -> elem = large -> elem;
deleteThis(large);
}
}
bool deletion(BinaryNode<int> * & root, int key){
if(root == NULL)
return 0;
if(root -> elem > key)
return deletion(root -> left, key);
else if(root -> elem < key)
return deletion(root -> right, key);
else if(root -> elem == key){
deleteThis(root);
return 1;
}
}
int main(){
BinaryNode<int> * root = constructSearchTree();
////////////////
/////basic operation
//inorderTraversal_recursive(root);
//cout << endl;
//preorderTraversal_recursive(root);
//cout << endl;
//preorderTraversal_stack(root);
//cout << endl;
//postorderTraversal_recursive(root);
//cout << endl;
//levelTraversal(root);
//cout << endl;
//////////////////
////////search tree
//BinaryNode<int> * node = search(root, 7);
//levelTraversal(node);
insert(root, 2);
//levelTraversal(root);
cout << deletion(root, 2) << endl << endl;
cout << deletion(root, 5) << endl << endl;
levelTraversal(root);
return 0;
}
转载于:https://blog.51cto.com/nocodes/1426567