returnbin_search(A,low,mid-1,x);
elsereturnbin_search(A,mid+1,high,x);
}
}
二叉排序树的算法
非递归算法
Bnode*bst_search(Bnode*T,keytypex)
{Bnode*P=T;
while(P!
=NULL)
if(x==P->key)returnP;
elseif(xkey)P=P->lchild;
elseP=P->rchild;
returnP;
}
递归算法
Bnode*bst_search(Bnode*T,keytypex)
{if(T==NULL||t->key==x)
returnT;
elseif(xkey)
returnbst_search(T->lchild,x);
elsereturnbst_search(T->rchild,x);
}
二叉排序树中插入结点的实现
voidinsert(Bnode*&T,Bnode*S)
{if(T==NULL)
T=S;
elseif(S->keykey)
insert(T->lchild,S);
elseinsert(T->rchild,S);
}
二叉排序树的构造
voidcreate_bst(Bnode*&T);
{Bnode*u;elementtypex;
T=NULL;cin>>x;
while(x!
=End_of_Num)
{u=newBnode;u->data=x;
u->lchild=NULL;u->rchild=NULL;
insert(T,u);
cin>>x;
}
}
假设在长度大于1的单循环链表中,既无头结点也无指针。
s为指向链表中某个结点的指针,试编写算法删除结点*s的直接前驱结点。
voidDeleteNode(ListNode*s)
{ListNode*p,*q;
p=s;
while(p->next!
=s)
{q=p;p=p->next;}
q->next=s;free(p);
}
输出二叉树T的所有结点的值
voidoutput(BitreeT)
{if(T)
{countleaf(T->child);
cout<data;
countleaf(T->rchild,n);
}
}
求一棵二叉树T的叶子结点数目
voidcountleaf(BitreeT,int&n)
{if(T)
{countleaf(T->child,n);
if(!
T->lchild&&!
T->rchild)n++;
countleaf(T->rchild,n);
}
}
求二叉树的深度
voiddepth(BitreeT)
{if(!
T)return0;
elsereturnmax(high(T->lchild),high(T->rchild))+1;
}
输入一个二叉树的先序序列,构造二叉链表。
voidcreate(Bitree&T)
{cin>>ch;
if(ch=='#')T=NULL;
else{T=newBnode;
T->data=ch;
create(T->lchild);
create(T->rchild);
}
}
先序遍历的非递归算法:
#definemaxsize100
typedefstruct
{BitreeElem[maxsize];
inttop;
}SqStack;
voidPreOrderUnrec(Bitreet)
{SqStacks;
StackInit(s);
p=t;
while(p!
=null||!
StackEmpty(s))
{while(p!
=null)
{visite(p->data);
push(s,p);
p=p->lchild;
}
if(!
StackEmpty(s))
{
p=pop(s);
p=p->rchild;
}
}
}
中序遍历的非递归算法:
#definemaxsize100
typedefstruct
{BitreeElem[maxsize];
inttop;
}SqStack;
voidInOrderUnrec(Bitreet)
{SqStacks;
StackInit(s);
p=t;
while(p!
=null||!
StackEmpty(s))
{while(p!
=null)
{p