按输入的关键字序列建立一棵二叉排序树,并删除该二叉排序树上的一个叶子结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题:二叉树采用二叉链表结构表示。
设计并实现如下算法:按输入的关键字序列建立一棵二叉排序树,并删除该二叉排序树上的一个叶子结点。
代码
/* Note:Your choice is C IDE */
/*二叉树采用二叉链表结构表示。
设计并实现如下算法:按输入的关键字序列
建立一棵二叉排序树,并删除该二叉排序树上的一个叶子结点。
*/
#include "stdio.h"
#include "stdlib.h"
typedef int TELemType;
typedef struct BiTNode{
TELemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
if(!T)
{
*p=f;
return 0;
}
if(key==T->data)
{
*p=T;
return 1;
}
if(key<T->data)
return SearchBST(T->lchild,key,T,p);
if(key>T->data)
return SearchBST(T->rchild,key,T,p);
return 0;
}
void InsertBST(BiTree *T,int key)
{
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p))
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=key;
s->lchild=s->rchild=NULL;
if(!p)
*T=s;
else if(key<p->data)
{p->lchild=s; }
else
{p->rchild=s;}
}
}
void NRPreOrder(BiTree bt){/*非递归先序遍历二叉树*/
BiTree stack[100],p; int top;
if (bt==NULL) return;
top=0; p=bt;
while(!(p==NULL&&top==0))
{ while(p!=NULL)
{ printf("%3d",p->data); /*访问结点的数据域*/ if (top<99) { /*将当前指针p压栈*/
stack[top]=p; top++; }
else { printf("栈溢出");return; }
p=p->lchild; /*指针指向p的左孩子*/ }
if (top<=0) return; /*栈空时结束*/
else { top--; p=stack[top]; } /*从栈中弹出栈顶元素*/
p=p->rchild ; /*指针指向p的右孩子结点*/ }
}
int DeleteLeaf(BiTree *T)
{
if((*T)->lchild==NULL&&(*T)->rchild==NULL)
{
*T=NULL;
return 0;
}
if(*T!=NULL)
{
return DeleteLeaf(&(*T)->lchild);
return DeleteLeaf(&(*T)->rchild);
}
return 0;
}
void main()
{
BiTree T;
int i;
int key[7]={45,24,53,45,12,24,90};
T=NULL;
for(i=0;i<7;i++)
{
InsertBST(&T,key[i]);
}
NRPreOrder(T);
DeleteLeaf(&T);
printf("\n");
NRPreOrder(T);
}。