// 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; }