树的递归理解起来需要花点时间;
关于查找二叉树的删除:
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode{
int data;
struct TreeNode *left;
struct TreeNode *right;
}tree;
typedef tree *PtrToTree;
typedef PtrToTree SearchTree;
SearchTree create();
SearchTree insert(int x,tree *p);
SearchTree deletex(int x,tree *p);
SearchTree find(int x,tree *p);
SearchTree findmin(tree *p);
SearchTree findmax(tree *p);
void print(tree *put,int depth);
void list(tree *p,int depth);
int main()
{
int x;
tree *p,*max,*min;
p = create();
list(p,0);
max = findmax(p);
min = findmin(p);
printf("max = %d min = %d\n",max->data,min->data);
printf("need to delete data : \n");
scanf("%d",&x);
p = deletex(x,p);
list(p,0);
return 0;
}
SearchTree create()
{
int x;
tree *root = NULL;
while(scanf("%d",&x)!=EOF)
root = insert(x,root);
return root;
}
SearchTree insert(int x,tree *p)
{
if(p==NULL)
{
p = (tree *)malloc(sizeof(tree));
p->data = x;
p->left = NULL;
p->right = NULL;
}
else if(x < p->data)
p->left = insert(x,p->left);
else if(x > p->data)
p->right = insert(x,p->right);//无视数据相同的情况
return p;
}
SearchTree deletex(int x,tree *p)
{
tree *current;
if(p==NULL)
printf("not find\n");
else if(x < p->data)
p->left = deletex(x,p->left);
else if(x > p->data)
p->right = deletex(x,p->right);//寻找需要删除的节点
else if(p->left && p->right)//当删除的节点存在左右子树时,
{
current = findmin(p->right);//找到节点右子数中最小的数据的节点
p->data = current->data;//将找到的最小的数据赋给需要删除的节点
p->right = deletex(current->data,p->right);//删除找到的最小数据那个节点,因为最小数据的节点不存在左儿子所以可以正常删除
}
else{//只存在单个儿子或不存在儿子时
current = p;//current指向需要删除的节点
if(p->left==NULL)
p = p->right;
else if(p->right==NULL)
p = p->left;//存在左儿子则将左儿子赋给它,即让该节点的父亲指向该节点的儿子,存在右儿子也是如此
free(current);//释放内存空间,完成删除
}
return p;
}
SearchTree find(int x,tree *p)
{
if(p==NULL)
return NULL;
if(x < p->data)
return find(x,p->left);
else if(x > p->data)
return find(x,p->right);
else
return p;
return NULL;
}
SearchTree findmin(tree *p)
{
if(p==NULL)
return NULL;
else if(p->left==NULL)
return p;
else
return findmin(p->left);
}
SearchTree findmax(tree *p)
{
if(p==NULL)
return NULL;
else if(p->right==NULL)
return p;
else
return findmax(p->right);
}
void print(tree *put,int depth)//深度显示每一层多一个tab
{
while(depth--)
{
printf("\t");
}
printf("%d\n",put->data);
}
void list(tree *p,int depth)//中序遍历,显示深度,由于BST性质,中序遍历一定是从小到大显示
{
if(p!=NULL)
{
list(p->left,depth+1);
print(p,depth);
list(p->right,depth+1);
}
}