对于二叉查找树的知识,我感觉主要是自己对算法的理解上,事先声明,由于本人一时犯糊涂,一不小心将左右的英文记反了,给你们的读代码带来很大的不便,因为是很早以前就是已经接触了二叉树,只是今天看代码的时候看到了后继啥的,所以索性就拿过来写写,不过和以前不一样的是,这个代码时双向的,也就是类似与双向的链表,所以,我觉得这个还是有点价值的,仅此参考,关于二叉树的建立,我们也可以用到递归,可以大大减少代码的量,同时查找的前继后继等本代码都没有写,同时因为代码是自己写的,难免有很多不值得推广的地方,所以,还是多请你们拿出你们的宝贵意见,闲话还是少说,我还是直接上代码了:
C语言:
Codee#12980
#include <stdio.h>
#include <malloc.h>
#define MAX_1 10
struct node
{
int weight;
int * parent;
int * left;
int * right;
};
typedef struct node Graph;
typedef Graph * Edge;
Edge Create_tree( Edge head , Edge New) //建立
{
Edge pointer;
Edge currentnode;
pointer = head;
if( pointer == NULL)
return New;
else
{
while( pointer != NULL)
{
currentnode = pointer;
if( New -> weight > pointer -> weight)
{
pointer = pointer -> left;
}
else
pointer = pointer -> right;
}
if( New -> weight > currentnode -> weight)
{
currentnode -> left = New;
New -> parent = currentnode;
}
else
{
currentnode -> right = New;
New -> parent = currentnode;
}
}
return head;
}
void print( Edge head) //print打印
{
Edge currentnode;
Edge pointer;
pointer = head;
if( pointer != NULL)
{
printf( "%d " , pointer -> weight);
print( pointer -> left);
print( pointer -> right);
}
}
void Insert_tree( Edge head) //insert a number插入
{
Edge New;
Edge pointer;
Edge currentnode;
pointer = head;
New =( Edge) malloc( sizeof( Graph));
New -> left = NULL;
New -> right = NULL;
New -> parent = NULL;
pointer = head;
printf( "please input the number you want to insert:");
scanf( "%d" , & New -> weight);
while( pointer != NULL)
{
currentnode = pointer;
if( New -> weight > pointer -> weight)
{
pointer = pointer -> left;
}
else
pointer = pointer -> right;
}
if( New -> weight > currentnode -> weight)
{
currentnode -> left = New;
New -> parent = currentnode;
}
else
{
currentnode -> right = New;
New -> parent = currentnode;
}
}
void Min_tree( Edge head) //最小数的结点
{
Edge pointer;
Edge currentnode;
pointer = head;
currentnode = pointer;
while( pointer != NULL)
{
currentnode = pointer;
pointer = pointer -> right;
}
printf( "%d" , currentnode -> weight);
}
void Successor_tree( Edge head , int key) //后继
{
Edge pointer;
Edge currentnode;
Edge innode;
pointer = head;
while( pointer != NULL)
{
if( pointer -> weight == key)
{
currentnode = pointer;
break;
}
else
if( key > pointer -> weight)
{
pointer = pointer -> left;
}
else
pointer = pointer -> right;
}
if( currentnode -> left != NULL)
{
Min_tree( currentnode -> left);
printf( " /n ");
}
else
{
innode = currentnode -> parent;
while( innode != NULL && currentnode == innode -> left)
{
currentnode = innode;
innode = currentnode -> parent;
}
}
printf( "%d" , pointer -> weight);
}
int main()
{
Edge New;
Edge head = NULL;
int key;
int n , i;
scanf( "%d" , &n);
for( i = 0; i <n; i ++)
{
New =( Edge) malloc( sizeof( Graph));
New -> left = NULL;
New -> right = NULL;
New -> parent = NULL;
scanf( "%d" , & New -> weight);
head = Create_tree( head , New);
}
print( head); //打印
printf( " /n ");
Insert_tree( head); //插入
print( head); //打印
printf( " /n ");
Min_tree( head);
printf( " /n ");
printf( "please input the number you want to Successor:");
scanf( "%d" , & key);
Successor_tree( head , key);
printf( " /n ");
return 0;
}
#include <malloc.h>
#define MAX_1 10
struct node
{
int weight;
int * parent;
int * left;
int * right;
};
typedef struct node Graph;
typedef Graph * Edge;
Edge Create_tree( Edge head , Edge New) //建立
{
Edge pointer;
Edge currentnode;
pointer = head;
if( pointer == NULL)
return New;
else
{
while( pointer != NULL)
{
currentnode = pointer;
if( New -> weight > pointer -> weight)
{
pointer = pointer -> left;
}
else
pointer = pointer -> right;
}
if( New -> weight > currentnode -> weight)
{
currentnode -> left = New;
New -> parent = currentnode;
}
else
{
currentnode -> right = New;
New -> parent = currentnode;
}
}
return head;
}
void print( Edge head) //print打印
{
Edge currentnode;
Edge pointer;
pointer = head;
if( pointer != NULL)
{
printf( "%d " , pointer -> weight);
print( pointer -> left);
print( pointer -> right);
}
}
void Insert_tree( Edge head) //insert a number插入
{
Edge New;
Edge pointer;
Edge currentnode;
pointer = head;
New =( Edge) malloc( sizeof( Graph));
New -> left = NULL;
New -> right = NULL;
New -> parent = NULL;
pointer = head;
printf( "please input the number you want to insert:");
scanf( "%d" , & New -> weight);
while( pointer != NULL)
{
currentnode = pointer;
if( New -> weight > pointer -> weight)
{
pointer = pointer -> left;
}
else
pointer = pointer -> right;
}
if( New -> weight > currentnode -> weight)
{
currentnode -> left = New;
New -> parent = currentnode;
}
else
{
currentnode -> right = New;
New -> parent = currentnode;
}
}
void Min_tree( Edge head) //最小数的结点
{
Edge pointer;
Edge currentnode;
pointer = head;
currentnode = pointer;
while( pointer != NULL)
{
currentnode = pointer;
pointer = pointer -> right;
}
printf( "%d" , currentnode -> weight);
}
void Successor_tree( Edge head , int key) //后继
{
Edge pointer;
Edge currentnode;
Edge innode;
pointer = head;
while( pointer != NULL)
{
if( pointer -> weight == key)
{
currentnode = pointer;
break;
}
else
if( key > pointer -> weight)
{
pointer = pointer -> left;
}
else
pointer = pointer -> right;
}
if( currentnode -> left != NULL)
{
Min_tree( currentnode -> left);
printf( " /n ");
}
else
{
innode = currentnode -> parent;
while( innode != NULL && currentnode == innode -> left)
{
currentnode = innode;
innode = currentnode -> parent;
}
}
printf( "%d" , pointer -> weight);
}
int main()
{
Edge New;
Edge head = NULL;
int key;
int n , i;
scanf( "%d" , &n);
for( i = 0; i <n; i ++)
{
New =( Edge) malloc( sizeof( Graph));
New -> left = NULL;
New -> right = NULL;
New -> parent = NULL;
scanf( "%d" , & New -> weight);
head = Create_tree( head , New);
}
print( head); //打印
printf( " /n ");
Insert_tree( head); //插入
print( head); //打印
printf( " /n ");
Min_tree( head);
printf( " /n ");
printf( "please input the number you want to Successor:");
scanf( "%d" , & key);
Successor_tree( head , key);
printf( " /n ");
return 0;
}