首先这三种操作都是基于二叉查找树所进行的操作,因此开始之前应该建立二叉查找树。
查找和插入由于比较好理解,直接看代码吧.
查找和插入://这个部分参考胡昭民编著清华出版的数据结构,有所改动。
#include <stdio.h>
#include <stdlib.h>
struct tree
{
int data;
struct tree *left,*right;
};
typedef struct tree node;
typedef node *btree;
btree creat_tree(btree,int);
btree search_tree(btree,int);
void Output(btree);
int main()
{
int i,num = 0,data[]={5,6,24,8,12,3,17,1,9};
btree ptr=NULL,leftroot = NULL, rightroot = NULL;
btree root=NULL;
for(i=0;i<9;i++)
ptr=creat_tree(ptr,data[i]); /*建立二叉树*/
Output(ptr);
printf("请输入要查找的值:\n");
scanf("%d",&num);
if(search_tree(ptr,num) != NULL)
printf("二叉树中已经存在该点\n");
else
creat_tree(ptr,num);
Output(ptr);
return 0;
}
btree creat_tree(btree root,int val) /*建立二叉树函数*/
{
btree newnode,current,backup;
newnode=(btree)malloc(sizeof(node));
newnode->data=val;
newnode->left=NULL;
newnode->right=NULL;
if(root==NULL)
{
root=newnode;
return root;
}
else
{
for(current=root;current!=NULL;)
{
backup=current;
if(current->data > val)
current=current->left;
else
current=current->right;
}
if(backup->data >val)
backup->left=newnode;
else
backup->right=newnode;
}
return root;
}
btree search_tree(btree ptr,int value)
{
while(1)
{
if(ptr == NULL)
return NULL;
if(ptr->data == value)
{
return ptr;
}
else
{
if(ptr->data > value)
{
ptr = ptr->left;
}
else
{
ptr = ptr->right;
}
}
}
}
void Output(btree ptr)
{
if(ptr)
{
Output(ptr->left);
printf("%d ",ptr->data);//中序的输出其实是一种排序,由小到大
Output(ptr->right);
}
}
删除:
可以分为三种情况:
- 删除的节点为树叶:只需要将与其相连的父节点指向 NULL 即可;
- 删除的节点只有一颗树,就将其指针放在其父节点的相反方向的指针;
- 删除的节点为两棵树:用另一节点来代替被删除的节点:右子树的最小元素或者左子树的最大元素;
BinTree Delete(int x,BinTree BST)
{
BinTree temp;
if( BST == NULL)
printf("要删除的元素未找到");
else if(x < BST->Data )
BST->Left = Delete(x,BST->left);
else if(x > BST->Data)
BST->Right = Delete(x,BST->Right);
else
{
if( BST->Left && BST->Right)
{
temp = FindMin(BST->Right);//右子树找最小的节点
BST->Data = temp->Data;
BST->Right = Delete(BST->Data,BST->Right);
}
else
{
temp = BST;
if( !BST->Left )
BST = BST->Right;
else
BST = BST->Left;
free(temp);
}
}
return BST;
}
删除程序代码图解:
举如下一个二叉树:
如要删除左子树中的数值 2 的节点: