// bogo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
struct Tree
{
int key;
Tree *left;
Tree *right;
Tree *p;
};
Tree *gRoot = NULL;
//插入节点
void fnInsert(Tree *date)
{
if (!gRoot)
{
gRoot = new Tree;
gRoot->key = date->key;
gRoot->left = NULL;
gRoot->right = NULL;
gRoot->p = NULL;
}
else
{
Tree *x = gRoot;
Tree *y = NULL;
while (x != NULL)
{
y = x;
if (date->key < x->key)
x = x->left;
else x = x->right;
}
date->p = y;
if(date->key < y->key)
y->left = date;
else y->right = date;
date->left = NULL;
date->right = NULL;
}
}
void fnSwapNode(Tree *src,Tree *des)
{
if (src->p == NULL)
gRoot = des;
else if (src == src->p->left)
src->p->left = des;
else src->p->right = des;
if(des != NULL)
des->p = src->p;
}
//中序遍历树
void fnShowTree(Tree *date)
{
if (!date) return ;
fnShowTree(date->left);
cout<<date->key<<" ";
fnShowTree(date->right);
}
Tree *fnFindMin(Tree *src)
{
while (src->left != NULL)
src = src->left;
return src;
}
void fnDeleteNode(Tree *des)//删除节点
//删除节点分四种情况
{
if (des->left == NULL)
fnSwapNode(des,des->right);
else if(des->right == NULL)
fnSwapNode(des,des->left);
else
{
Tree *x = fnFindMin(des->right);
if (x->p != des)
{
fnSwapNode(x,x->right);
x->right = des->right;
x->right->p = x;
}
fnSwapNode(des,x);
x->left = des->left;
x->left->p = x;
}
delete(des);
}
Tree *fnSearchTree(int key)//寻找树
{
if (gRoot->key == key)
return gRoot;
else
{
Tree *temp = gRoot;
while (gRoot != NULL)
{
if (key < temp->key)
temp = temp->left;
else if (key > temp->key)
temp = temp->right;
else return temp;
}
return NULL;
}
}
void fnDestoryTree(Tree *x)//销毁树
{
if ( x == NULL) return;
else
{
fnDestoryTree(x->left);
fnDestoryTree(x->right);
delete(x);
}
}
void fnRandBuildTree(int num)//随机生出num个节点并插入二叉树
{
srand((int)time(0));
Tree *temp = NULL;
while (num--)
{
temp = new Tree;
temp->key = rand()%100;
fnInsert(temp);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int x;
Tree *temp;
while (true)
{
cout<<"1.随机生成二叉树"<<endl;
cout<<"2.插入节点"<<endl;
cout<<"3.删除节点"<<endl;
cout<<"4.浏览节点"<<endl;
cout<<"5.退出程序"<<endl;
cin>>x;
switch (x)
{
case 1:
{
cout<<"输入节点数:";
cin>>x;
fnRandBuildTree(x);
break;
}
case 2:
{
cout<<"输入节点数:";
temp = new Tree;
cin>>temp->key;
fnInsert(temp);
break;
}
case 3:
{
cout<<"输入要删除节点数据:";
cin>>x;
fnDeleteNode(fnSearchTree(x));
break;
}
case 4:
{
cout<<"遍历输出"<<endl;
fnShowTree(gRoot);
break;
}
case 5:
{
fnDestoryTree(gRoot);
exit(-1);
}
default:
break;
}
system("pause");
system("cls");
}
return 0;
}