include

include<stdlib.h>

using namespace std;
typedef struct node {
int data;
struct node* left;
struct node* right;
}Node;
typedef struct tree{
Node* Tree_root=NULL;
}Tree;
void insert_tree(Tree tree, int data) {
Node
node = (Node)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right=NULL;
if (tree->Tree_root == NULL) {
tree->Tree_root = node;
}
else
{
Node
temp = tree->Tree_root;
while (temp != NULL)
{
if (data < temp->data)
if (temp->left == NULL)
{
temp->left = node;
return;
}
else
temp = temp->left;
else
if (temp->right == NULL)
{
temp->right = node;
return;
}
else
temp = temp->right;
}
}
}
void inorder(Node* node) {
if (node != NULL){
inorder(node->left);
cout << node->data <<" ";
inorder(node->right);
}

}
void preorder(Node* node) {
if (node != NULL) {
cout << node->data <<" ";

    inorder(node->left);
    inorder(node->right);
}

}
void postorder(Node* node) {
if (node != NULL) {
inorder(node->left);
inorder(node->right);
cout << node->data <<" ";

}

}
int search_order(Node* node, int m) {
if (node != NULL) {
if (node->data == m) {
cout << "find" << endl;;
return 0;
}
if (node->data > m)
return search_order(node->left,m);
if (node->data < m)
return search_order(node->right, m);
}
cout << "not find" << endl;
return -1;
}
Node* delete_order(Node* node, int m) {
Node* p, q;
if (node == NULL || node->data==m && node->left==NULL && node->right==NULL)
return NULL;
if (node->data == m)
{
/*case 1 叶子结点的删除操作
/
if (node->left == NULL && node->right == NULL)
free(node);
/case 2 只有左子树/只有右子树的结点/
if (node->right == NULL) {
p = node;
node = node->left;
free(p);
}
else if (node->left == NULL) {
p = node;
node = node->right;
free(p);
}
/case 3左子树和右子树都存在的结点/
else {
//首先伪装成前驱结点
p = node;
q = node->left;
//假设有右子树,就不断向右推进,p随之推进
//假设q没有右子树,p和q都留在原地
while (q->right) {
p = q;
q = q->right;
}
//删除的是q,不是node;
node->data = q->data;
//情况:直接前驱为当前的结点的左结点的最右边的结点
if (p != node) {
//直接前驱结点一定不会存在右子树,已经推到最右边,所以左子树是他留给
//p的遗产,接到p的右子树上
p->right = q->left;
}
else {
p->left = q->left;
}
free(q);
}
}
else if (node->data > m)
{
node->left = delete_order(node->left, m);
}
else
node->right = delete_order(node->right, m);
return node;
}
int main()
{
Tree tree;
int arr[7] = {6,3,8,2,7,5,9};

for (int i = 0;i < 7;i++)
    insert_tree(&tree, arr[i]);
//检验BST插入操作
insert_tree(&tree, 9);//BST插入操作
preorder(tree.Tree_root);//线序序列
inorder(tree.Tree_root);//中序序列
postorder(tree.Tree_root);//后序序列
//查询操作
search_order(tree.Tree_root, 9);//查询操作
search_order(tree.Tree_root,-8);
//删除操作
delete_order(tree.Tree_root, 9);//删除操作
inorder(tree.Tree_root);//检测-8是否删除
system("pause");
return 0;

}