赞
踩
typedef struct Node
{
int elem;//存放数据
struct Node *lchild, *rchild;
struct Node *prev;
} TreeNode, *BiTree; //定义树节点的结构体
typedef struct tree
{
BiTree root;
}Tree,*pTree;
void CreateBST(pTree T)//构造二叉排序树 { int e=0;//初始化 while(1)//while循环建立二叉排序树 { printf("Please input the child of BST:"); printf("(input will over when you input -1.)\n"); scanf("%d",&e);//插入的数据 getchar(); if(e==-1)//非法判断 { break; } BiTree n1=(BiTree)malloc(sizeof(TreeNode));//申请空间 BiTree n2=T->root;//初始化 n1->elem=e; n1->lchild=NULL; n1->rchild=NULL; n1->prev=NULL; if(T->root==NULL)//当树不存在时 { T->root=n1; } else//当树存在时 { while(1)//实现二叉树插入 { if(e==n2->elem)//若树中存在此元素 { printf("this elem has existed!\n"); break; } if(e>n2->elem&&n2->rchild==NULL) { n2->rchild=n1; n1->prev=n2; break; } else if(e>n2->elem) { n2=n2->rchild; } else if(e<n2->elem&&n2->lchild==NULL) { n2->lchild=n1; n1->prev=n2; break; } else if(e<n2->elem) { n2=n2->lchild; } } } } }
删除可能出现的几种情况
这里,我对第三种查找到了二叉排序树中存在该节点并删除进行展开讨论。
二叉排序树中的删除节点的三种情况
1.即将删除的节点为叶结点。
2.即将删除的节点仅存在左子树或者仅存在右子树。(这里以仅存在左子树为例)
3.即将删除的结点即存在右子树,也存在左字数。
void DeleteNode(pTree T)//删除二叉排序树的结点
{
int e;
BiTree n=T->root;
BiTree n1=NULL;
BiTree n2=NULL;
printf("Please input the elem you want to delete:\n");
scanf("%d",
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。