
#include <iostream>
using namespace std;
typedef struct bitt{
int date;
bitt *left;
bitt *right;
}*Bitree,bitree;
Bitree find_data(Bitree star,int x){
if (star->date == x){
return star;
}else if(star->date < x){
return find_data(star->right,x);
}else if(star->date > x){
return find_data(star->left,x);
}
return NULL;
}
/*============Worning Woring SSS================*/
void Delete_tree(Bitree &T,int x){
// 写轮眼
Bitree p = T;
Bitree f = NULL; // 父节点
Bitree q,s; // q ?
if(!T) return; // 如果为空就返回
// 首先找到p
while (p){
if(p->date == x)break; // 找到了就退出了
f = p; // 父节点
if (p->date > key)
{
p = p->left;
}else{
p = p->right;
}
}
if(p == NULL) return; // 没找到返回
// 要删除节点首先就要找到那个节点
// - 再判断情况
// - 如果他的左树和右树🌲是否为空
// - 为空: 左树为空 把右树直接挂上去 ,右树为空直接把 左树挂上去
// - 不为空: 寻找直接前驱 , 如果 左树没有右子树 那么 直接等于左子树, 如果左子树 有右节点 ,直接用找到的s的节点值 等于 s的节点值
// - 等于节点值后呢 需要接上节点的q是 s的父亲节点
// - 如果s存在 那么 父节点等于他的 左子树
// - 如果s不存在 说明 对于节点来说他没有要右子树,也就是说明s是左子树 直接让它的左节点 和父节点指向他相接
if((!p->left)&&(!p->right)){ // 如果左右树不为空
q = p;
s = p->left; // s = 左树
while (s->right){
q =s;
s = s->right;
}
p->date = s->date;
/*====================*/
if(q!=p){
q->right = s->left;
}else{
q->left = s->left;
}
/*====================*/
delete s;
}else{
// p是找到的原则
if(!q->left){
q=p;
p = p->right;
}
if(!q->right){
q = p;
p = p->left;
}
if(!f){ // 如果在头节
T = p;
}else if(q == f->left){
f->left = p;
}else{
f->right = p;
}
delete q;
}
}
/*==============================================*/
void Create_tree(Bitree &star,int x){
if(star == NULL){
star = new bitree;
star->date = x;
cout <<"insert : " << x << endl;
star->left= star->right =NULL;
return;
}else if(star->date > x){
Create_tree(star->left,x);
}else if(star->date <= x){
Create_tree(star->right,x);
}
}
void for_tree_mid(Bitree star){
if(star == NULL) return;
for_tree_mid(star->left);
cout << star->date << " ";
for_tree_mid(star->right);
}
int main(){
int n;
cin >> n;
Bitree x = NULL;
int tempnum;
for (int i = 0; i < n; i++){
cin >> tempnum;
Create_tree(x,tempnum);
}
// cout << x->date;
for_tree_mid (x);
}