/***二叉查找树的结点插入,查找,删除,计算树的高度*****/
#include <stdio.h>
#include <stdlib.h>
typedef int type_t;
typedef struct node
{
type_t data;
struct node *left;
struct node *right;
}Node;
Node *tree_create(type_t data)
{
Node *ptree = malloc(sizeof(Node));
ptree->data = data;
ptree->left = NULL;
ptree->right = NULL;
return ptree;
}
void node_insert(Node **ptree,Node *pnode)
{
if(!*ptree)
*ptree = pnode;
else
{
Node *p = *ptree;
Node *parent = NULL;
while(NULL != p)
{
parent = p;
if(pnode->data < p->data)
{
p = p->left;
}
else
{
p = p->right;
}
}
if(pnode->data < parent->data)
{
parent->left = pnode;
}
else
{
parent->right = pnode;
}
}
}
void node_insert_by_recursion(Node **ptree,Node *pnode)
{
if(!*ptree)
*ptree = pnode;
else
{
if(pnode->data < (*ptree)->data)
{
node_insert_by_recursion(&((*ptree)>left),pnode);
}
else
{
node_insert_by_recursion(&((*ptree)->right),pnode);
}
}
}
int tree_pre_order(Node *tree)
{
if(NULL == tree)
return;
else
{
printf("%d ",tree->data);
tree_in_order(tree->left);
tree_in_order(tree->right);
}
}
int tree_in_order(Node *tree)
{
if(NULL == tree)
return;
else
{
tree_in_order(tree->left);
printf("%d ",tree->data);
tree_in_order(tree->right);
}
}
int tree_post_order(Node *tree)
{
if(NULL == tree)
return;
else
{
tree_in_order(tree->left);
tree_in_order(tree->right);
printf("%d ",tree->data);
}
}
Node *search_node(Node *tree,int data)
{
if (!tree)
return NULL;
else
{
if (tree->data == data)
{
return tree;
}
else if(tree->data < data)
return search_node(tree->right,data);
else
return search_node(tree->left,data);
}
}
int tree_height(Node *tree)
{
if(!tree)
return;
else
{
int lh = tree_height(tree->left);
int rh = tree_height(tree->right);
if(lh < rh)
return rh + 1;
else
return lh + 1;
}
}
void node_delete(Node **ptree, int data)
{
Node *pFind = *ptree;
Node *pParent = NULL;
Node *pDelete = NULL;
while(pFind != NULL)
{
if(pFind->data == data)
break;
else if(data < pFind->data)
{
pParent = pFind;
pFind = pFind->left;
}
else
{
pParent = pFind;
pFind = pFind->right;
}
}
if(pFind == NULL)
{
return;
}
else if(pFind->left == NULL)
{
if(pParent == NULL)
{
*ptree= pFind->right;
}
else
{
if(pParent->left == pFind)
{
pParent->left = pFind->right;
}
else
{
pParent->right = pFind->right;
}
}
free(pFind);
return;
}
else if(pFind->left->right == NULL)
{
pDelete = pFind->left;
pFind->data = pDelete->data;
pFind->left = pDelete->left;
free(pDelete);
return;
}
else
{
pParent = pFind->left;
pDelete = pParent->right;
while(pDelete->right != NULL)
{
pParent = pDelete;
pDelete = pDelete->right;
}
pParent->right = pDelete->left;
pFind->data = pDelete->data;
free(pDelete);
return;
}
}
void tree_destroy(Node **ptree)
{
if (*ptree == NULL)
{
return ;
}
**重点内容**
Node *p = *ptree;
tree_destroy(&(p->left));
tree_destroy(&(p->right));
printf("\ndelete %d", p->data);
free(p);
*ptree = NULL;
}
int main()
{
Node *ptree= NULL;
Node *pnode = NULL;
int i;
int a[5] = {1,3,3,5,6};
for(i = 0; i < 5; i++)
{
pnode = tree_create(a[i]); //新子树生成
node_insert(&ptree,pnode); //非递归法
//node_insert_by_recursion(&ptree,pnode);//递归法
}
printf("中序遍历\n");
tree_in_order(ptree);
// printf("前序遍历\n");
// tree_pre_order(ptree);
// printf("后序遍历\n");
// tree_post_order(ptree);
printf("\n高度:");
int height = tree_height(ptree);
printf("%d\n", height);
printf("查找某个数,输入:");
scanf("%d",&i);
pnode = search_node(ptree,i);
if(pnode != NULL)
{
printf("%d\n",pnode->data);
}
else
{
printf("not found\n");
}
printf("删除结点\n");
node_delete(&ptree,3);
tree_in_order(ptree);
tree_destroy(&ptree);
return 0;
}
经检测,运行结果正确。