二叉查找树(二叉搜索树):
——摘自《挑战》
输入若干条命令,执行以下操作:
insert x——将x插入到二叉排序查找树中
delete x——从二叉排序查找树中删除x
find x——从二叉排序查找树中查找x,找到则输出yes,否则输出no
min——输出该二叉排序查找树的最小值
traverse——输出中序遍历该二叉树的结果
pre——输出先序遍历该二叉树的结果
post——输出后序遍历该二叉树的结果
level——输出层序遍历该二叉树的结果
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Node //二叉搜索树的结点 4 { 5 int key; 6 Node *left,*right,*parent; 7 }; 8 Node *root,*NIL; 9 void insert(int k)//插入操作 10 { 11 Node *y=NIL; //x的父结点 12 Node *x=root; 13 Node *z; 14 15 z=(Node *)malloc(sizeof(Node)); 16 z->key=k; 17 z->left=NIL; 18 z->right=NIL; 19 20 while(x!=NIL){ 21 y=x; //设置父结点 22 if(z->key<x->key) 23 x=x->left; //移动至左结点 24 else 25 x=x->right; //移动至右结点 26 } 27 z->parent=y; 28 29 if(y==NIL) 30 root=z; 31 else{ 32 if(z->key<y->key) 33 y->left=z; 34 else 35 y->right=z; 36 } 37 } 38 Node *find(Node *root,int k)//查找操作 39 { 40 while(root!=NIL&&k!=root->key){ 41 if(k<root->key) 42 root=root->left; 43 else 44 root=root->right; 45 } 46 return root; 47 } 48 Node *treeMinimum(Node *x)//二叉搜索树的最小值 49 { 50 while(x->left!=NIL) 51 x=x->left; 52 return x; 53 } 54 Node *treeSuccessor(Node *x)//搜索后一个结点 55 { 56 if(x->right!=NIL) 57 return treeMinimum(x->right); 58 Node *y=x->parent; 59 while(y!=NIL&&x==y->right){ 60 x=y; 61 y=y->parent; 62 } 63 return y; 64 } 65 void treeDelete(Node *z)//删除操作 66 { 67 Node *y; //要删除的对象 68 Node *x; //y的子节点 69 70 //确定要删除的结点 71 if(z->left==NIL||z->right==NIL)//z没有或只有一个子结点时,要删除的对象为z 72 y=z; 73 else //z有两个子结点时,删除对象为z的后一个结点 74 y=treeSuccessor(z); 75 //确定y的子结点x 76 if(y->left!=NIL)//如果y有左子结点,则x为y的左子结点 77 x=y->left; 78 else //如果y没有左子结点,则x为y的右子结点 79 x=y->right; 80 81 if(x!=NIL) 82 x->parent=y->parent;//设置x的父结点 83 84 if(y->parent==NIL)//如果y是根结点,则x成为树的根节点 85 root=x; 86 else{ 87 if(y==y->parent->left)//如果y是其父结点p的左子结点,则x成为p的左子结点 88 y->parent->left=x; 89 else //如果y是其父结点p的右子结点,则x成为p的右子结点 90 y->parent->right=x; 91 } 92 93 if(y!=z)//z的后一个结点被删除时 94 z->key=y->key; //将y的数据复制到z中 95 96 free(y); 97 } 98 void inorder(Node *root)//中序遍历 99 { 100 if(root==NIL)return; 101 inorder(root->left); 102 printf("%d ",root->key); 103 inorder(root->right); 104 } 105 void preorder(Node *root)//先序遍历 106 { 107 if(root){ 108 printf("%d ",root->key); 109 preorder(root->left); 110 preorder(root->right); 111 } 112 } 113 void postorder(Node *root)//后序遍历 114 { 115 if(root!=NULL){ 116 postorder(root->left); 117 postorder(root->right); 118 printf("%d ",root->key); 119 } 120 } 121 void levelorder(Node *root){ //层序遍历 122 if(root!=NULL){ 123 queue<Node*>que; 124 que.push(root); 125 Node *p; 126 while(!que.empty()){ 127 p=que.front(); 128 que.pop(); 129 printf("%d ",p->key); 130 if(p->left!=NULL) 131 que.push(p->left); 132 if(p->right!=NULL) 133 que.push(p->right); 134 } 135 } 136 } 137 int main() 138 { 139 string order; 140 int x; 141 while(!(cin>>order).eof()) //输入命令 142 { 143 if(order=="insert"){ //把x插入到二叉排序查找树中 144 scanf("%d",&x); 145 insert(x); 146 } 147 else if(order=="find"){ //查找x,找到则输出yes,否则输出no 148 scanf("%d",&x); 149 Node *t=find(root,x); 150 if(t!=NIL) 151 printf("yes\n"); 152 else 153 printf("no\n"); 154 } 155 else if(order=="delete"){ //从二叉排序查找树删除x 156 scanf("%d",&x); 157 treeDelete(find(root,x)); 158 } 159 else if(order=="min"){ //从二叉排序树中查找最小值输出 160 Node *MIN=treeMinimum(root); 161 printf("%d\n",MIN->key); 162 } 163 else if(order=="traverse"){ //输出中序遍历该二叉树的结果(升序排列序列) 164 inorder(root); 165 printf("\n"); 166 } 167 else if(order=="pre"){ //输出前序遍历 168 preorder(root); 169 printf("\n"); 170 } 171 else if(order=="level"){ //输出层序遍历 172 levelorder(root); 173 printf("\n"); 174 } 175 else if(order=="post"){ //输出后序遍历 176 postorder(root); 177 printf("\n"); 178 } 179 } 180 return 0; 181 }
运行结果: