-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinarySortTree.cpp
112 lines (97 loc) · 2.42 KB
/
BinarySortTree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct BinTree{
int num;
BinTree *left;
BinTree *right;
}BinTree;
/**
*二叉排序树插入
*/
void InsertBST(BinTree **bintree , int num){
if(*bintree == NULL){
*bintree = new BinTree;
(*bintree)->num = num;
(*bintree)->left = NULL;
(*bintree)->right = NULL;
}else{
if(num < (*bintree)->num){
InsertBST(&(*bintree)->left , num);
}else if(num > (*bintree)->num){
InsertBST(&(*bintree)->right , num);
}
}
}
BinTree *FindMin(BinTree *bintree){
while(bintree->left != NULL){
bintree = bintree->left;
}
return bintree;
}
/**
*二叉排序树删除
*/
BinTree *DeleteBST(BinTree *bintree , int n){
if(bintree == NULL){
cout << "未找到该元素" <<endl;
}else{
if(n < bintree->num){
bintree->left = DeleteBST(bintree->left , n);
}else if(n > bintree->num){
bintree->right = DeleteBST(bintree->right , n);
}else{
if(bintree->left != NULL && bintree->right != NULL){
//获取右子树的最小值
BinTree *minNode = FindMin(bintree->left);
bintree->num = minNode->num;
DeleteBST(bintree->left , minNode->num);
}else{
BinTree *tmp;
tmp = bintree;
if(bintree->left == NULL){
bintree = bintree->right;
}else{
bintree = bintree->left;
}
free(tmp);
}
}
}
return bintree;
}
void CreateBST(BinTree **bintree){
int n ;
cin >>n;
while(n != 0){
InsertBST(bintree , n);
cin >>n;
}
}
void InOrderTraversal(BinTree *bintree){
if(bintree == NULL){
return;
}else{
InOrderTraversal(bintree->left);
cout << bintree->num <<endl;
InOrderTraversal(bintree->right);
}
}
int main(){
BinTree *bintree = NULL;
CreateBST(&bintree);
cout << "前序遍历:" <<endl;
InOrderTraversal(bintree);
int n;
cout << "随机插入一个数:" <<endl;
cin >>n;
InsertBST(&bintree , n);
cout << "中序遍历:" <<endl;
//InOrderTraversal(bintree);
cin >>n;
cout <<"输入要删除的数:" <<endl;
BinTree *newTree = DeleteBST(bintree , n);
cout <<"中序遍历:" <<endl;
InOrderTraversal(newTree);
return 0;
}