标签:第一个 树的操作 out turn size 中序 insert 最小 最小值
二叉搜索树满足这样的性质:
struct Node{
int key;
Node*parent ;
Node*left;
Node*right;
};
Node*root,*NIL;
插入
找到合适的位置,然后添加节点。
void insert(int k){
Node* cur = root;//用于记录当前搜到哪里
Node* par = NIL;//用于记录这个插入的节点的父亲节点
Node* z = (Node *)malloc(sizeof(Node));
z->key = k;
z->left = NIL;
z->right = NIL;
while(cur != NIL){
par = cur;
if(z->key < cur->key) cur = cur->left;
else cur = cur->right;
}
z->parent=par;
if(par == NIL){
root = z;
}else{
if(z->key < par->key){
par->left = z;
}else{
par->right = z;
}
}
}
查找
根据二叉搜索树的性质,每次选择合适的分支,最后搜到 NIL 说明失败。
Node* find(int k){
Node *cur = root;
while(cur != NIL && cur->key != k){
if(k < cur->key)cur = cur->left;
else cur = cur->right;
}
return cur;
}
求最小值
Node * treeMinimum(Node *x){
while(x->left != NIL) x= x->left;
return x;
}
求后一个节点(在中序遍历时后一个输出的)
Node * treeSuccessor(Node* x){
if(x->right != NIL)return treeMinimum(x->right);
Node* y = x->parent;
while(y != NIL && x == y->right){//网上找,找到第一个比它(x)大的
x = y;
y=y->parent;
}
return y;
}
删除节点
void deleteNode(Node * z){
Node *y;//要删除的对象
Node* x;//y的子节点
//确定要删除的节点
if(z->left == NIL || z->right == NIL) y = z;
else y = treeSuccessor(z);
//确定y的子节点x
if(y->left != NIL){
x = y->left;
}else{
x = y->right;
}
if(x != NIL){
x->parent = y->parent;
}
if(y->parent == NIL){
root = x;
}else{
if(y == y->parent->left){
y->parent->left = x;
}else{
y->parent->right = x;
}
}
if(y != z){
z->key = y->key;
}
free(y);
}
中序遍历
void inorder(Node* u){
if(u == NIL)return;
inorder(u->left);
cout<<" "<<u->key;
inorder(u->right);
}
前序遍历
void preorder(Node* u){
if(u == NIL)return;
cout<<" "<<u->key;
preorder(u->left);
preorder(u->right);
}
标签:第一个 树的操作 out turn size 中序 insert 最小 最小值
原文地址:https://www.cnblogs.com/Softwarer1412/p/14727696.html