#include <stdio.h>
#include <stdlib.h>
struct node
{
int key;
int k;
struct node* left;
struct node* right;
};
typedef struct node* TREE;
TREE makenode(int key);
TREE insert(TREE root, int key);
void insert2(TREE root, int key);
TREE deletenode(TREE root);
TREE deletekey(TREE root, int key);
TREE insertrightmost(TREE a, TREE b);
void inorder(TREE root);
void printk(TREE root,int k);//kth smallest
int main(void)
{
TREE root=NULL;
int i;
root = insert(root, 4);
root = insert(root, 2);
root = insert(root, 1);
root = insert(root, 3);
insert2(root,6);
insert2(root,5);
insert2(root,7);
inorder(root);
printf("\n");
//printk(root,1);
//printk(root,2);
for (i=0;i<7;i++)
printk(root,i+1);
//root = deletekey(root,4);
root = deletekey(root,7);
inorder(root);
}
TREE makenode(int key)
{
TREE temp = (TREE)malloc(sizeof(struct node));
temp->key=key;
temp->left=NULL;
temp->right=NULL;
temp->k= 1;
return temp;
}
TREE insert(TREE root, int key)
{
if (root == NULL){
return makenode(key);
}
if (root->key > key)
{
root->k++;
root -> left = insert(root->left,key);
}
else if (root->key < key)
{
root->right = insert(root->right,key);
}
return root;
}
void insert2(TREE root, int key)
{
if (root == NULL){
root = makenode(key);
return;
}
if (root->key > key){
if (root->left == NULL){
root->k++;
root->left = makenode(key);
return;
}
root->k++;
insert(root->left,key);
}
else if (root->key < key){
if (root->right == NULL){
root->right= makenode(key);
return;
}
insert(root->right,key);
}
}
TREE insertrightmost(TREE a, TREE b)
{
if (a == NULL)
return b;
a->right = insertrightmost(a->right,b);
return a;
}
TREE deletenode(TREE root)
{
TREE temp, lefttemp;
temp=root->right;
//temp->left = root->left;
if (root->right && root->right->left)
{
root->left = insertrightmost(root->left,root->right->left);
}
if (root->left)
temp->left = root->left;
if (temp && temp->right)
temp->right->left=NULL;
root = temp;
return root;
}
TREE deletekey(TREE root, int key)
{
if (root==NULL)
return NULL;
if (root->key == key)
{
root= deletenode(root);
}
else if (root->key > key)
{
root ->left = deletekey(root->left,key);
}
else //if (root -> key < key)
{
root ->right = deletekey(root->right,key);
}
return root;
}
void printk(TREE root,int k)
{
if (root->k == k)
{
printf ("%d\n",root->key);
}
else if (k > root->k)
{
printk(root->right, k - (root->k));
}
else
{
printk(root->left,k);
}
}
void inorder(TREE root)
{
if (root == NULL)
return;
inorder(root->left);
printf ("%d ",root->key);
inorder(root->right);
}
'자료구조' 카테고리의 다른 글
simple adjacency list (0) | 2015.05.22 |
---|---|
hash simple linear (0) | 2015.05.22 |
link list(single) (0) | 2015.05.01 |
boolean combination (0) | 2015.05.01 |