二叉搜索树:
(1)左子树上的所有节点的关键码小于根节点的关键码
(2)右子树上的所有节点的关键码大于根节点的关键码
(3)左子树和右子树也是二叉搜索码
插入:直接搜索并插入
删除:
(1)删除叶节点,只需将其父节点指向他的指针清空。
(2)左右子树有一个为空,则拿子节点来顶替父节点的位置,再释放它。
(1)左子树上的所有节点的关键码小于根节点的关键码
(2)右子树上的所有节点的关键码大于根节点的关键码
(3)左子树和右子树也是二叉搜索码
插入:直接搜索并插入
删除:
(1)删除叶节点,只需将其父节点指向他的指针清空。
(2)左右子树有一个为空,则拿子节点来顶替父节点的位置,再释放它。
(3)左右子树不为空,在其右子树下寻找中序下的第一个节点,用它的值填补到被删节点中,然后处理该节点的删除问题。该节点删除问题转化为前两个情况,因此可以递归的进行处理。
/*************************************************************************
> File Name: BinarySearchTree.cpp
> Author: ltf
> Mail: @qq.com
> Created Time: Sun 27 Mar 2016 08:56:06 PM CST
************************************************************************/
#include<iostream>
using namespace std;
typedef struct Tree{
Tree *left;
Tree *right;
int data;
}*pTree;
//插入元素,生成二叉搜索树
Tree* insertElement(int x,Tree *root)
{
if(root == NULL)
{
root = new Tree();
root->data = x;
root->left = NULL;
root->right = NULL;
return root;
}
Tree *p = root;
Tree *last = p;
while(p != NULL)
{
last = p;
if(p->data > x)
p = p->left;
else if(p->data < x)
p = p->right;
else
return root;
}
p = new Tree();
p->left = NULL;
p->right = NULL;
p->data = x;
if(last->data < x)
last->right = p;
else
last->left = p;
return root;
}
// 非递归删除元素
bool deleteElementNonRecursive(int x,Tree *&root)
{
Tree *p = root;
Tree *last = p;
bool direct = false;
while(p != NULL)
{
if(p->data < x)
{
last = p;
p = p->right;
direct = true;
}
else if(p->data > x)
{
last = p;
direct = false;
p = p->left;
}
else
{
if(p->left == NULL)
{
if(p == root)
root = root->right;
else
{
if(direct)
last->right = p->right;
else
last->left = p->right;
}
delete p;
return true;
}
else if(p->right == NULL)
{
if(p == root)
root = root->left;
else
{
if(direct)
last->right = p->left;
else
last->left = p->right;
}
delete p;
return true;
}
else
{
Tree *temp = p->right;
while(temp->left != NULL)
temp = temp->left;
swap(temp->data,p->data);
last = p;
p = p->right;
direct = true;
}
}
}
return false;
}
// 递归删除元素,比较简单,注意传递的是引用指针
bool deleteElement(int x, Tree *&p)
{
if(p->data < x)
return deleteElement(x,p->right);
else if(p->data > x)
return deleteElement(x,p->left);
else
{
Tree *temp = p;
if(p->left == NULL)
{
p = p->right;
delete temp;
return true;
}
else if(p->right == NULL)
{
p = p->left; // 这儿直接会修改原来的指针
delete temp;
return true;
}
else
{
Tree *q;
q = p->right;
while(q->left != NULL)
q = q->left;
swap(p->data,q->data);
return deleteElement(x,p->right);
}
}
}
void print(Tree *tree)
{
if(tree != NULL)
{
print(tree->left);
cout << tree->data;
print(tree->right);
}
}
// 释放树节点
void freeTree(Tree *tree)
{
if(tree != NULL)
{
freeTree(tree->left);
freeTree(tree->right);
delete tree;
}
}
int main()
{
int value;
Tree *root = NULL;
cout << "input the node" << endl;
cin >> value;
while(value != 0)
{
root = insertElement(value ,root);
cin >> value;
}
print(root); cout << endl;
cout << "input the num to delete" << endl;
cin >> value;
while(value != 0)
{
//if(deleteElementNonRecursive(value,root))
if(deleteElement(x,root))
{
cout << "succeed" << endl;
}
else
cout << "not existed" << endl;
print(root); cout << endl;
cin >> value;
}
freeTree(root);
cout << "tree freed" << endl;
return 0;
}