/*二分查找即为判定树*/
int binarysearch(list tbl,elementtype k)
{
int left,right,mid,nofound=-1;
left=1;
right=tbl->length;
while(left<=right)
{
mid=(left+right)/2;
if(k<tbl->element[mid]) right=mid-1;
else if(k>tbl->element[mid]) left=mid+1;
else return mid;
}
return notfound;
}
//树的各种操作
//链表的数据结构
typedef struct treenode *bintree;
typedef bintree position;
struct treenode{
elementtype data;
bintree left;
bintree right;
}
//二叉树的遍历
//先序遍历
void preordertraversal(bintree bt)
{
if(bt)
{
printf("%d",bt->data);
preordertraversal(bt->left);
preordertraversal(bt->right);
}
}
//中序遍历
void inordertraversal(bintree bt)
{
if(bt)
{
inordertraversal(bt->left);
printf("%d",bt->data);
intordertraversal(bt->right);
}
}
//后序遍历
void postordertraversal(bintree bt)
{
if(bt)
{
postordertraversal(bt->left);
postordertraversal(bt->right);
printf("%d",bt->data);
}
}
//二叉树的非递归遍历
//中序遍历非递归遍历算法, 使用堆栈
void inordertraversal(bintree bt)
{
bintree t=bt;
stack s=creatstack(maxsize);//创建并初始化堆栈S
while(t||!isempty(s))
{
while(t) //一直向左并将沿途节点压入堆栈
{
push(s,t);
t=t->left;
}
if(!isempty(s))
{
t=pop(s); //节点弹出堆栈
printf("%5d",t->data); //访问并打印节点
t=t->right;//转向 右子树
}
}
}
//先序遍历非递归遍历算法, 使用堆栈
void inordertraversal(bintree bt)
{
bintree t=bt;
stack s=creatstack(maxsize);//创建并初始化堆栈S
while(t||!isempty(s))
{
while(t) //一直向左并将沿途节点压入堆栈
{
printf("%5d",t->data); //访问并打印节点
push(s,t);
t=t->left;
}
if(!isempty(s))
{
t=pop(s); //节点弹出堆栈
t=t->right;//转向 右子树
}
}
}
//层序遍历
/*队列实现 节点出队,访问该节点,其左右儿子入队*/
void levelordertraversal(bintree bt)
{
queue q;
bintree t;
if(!bt) return ;//如果是空树,直接返回
q=creatqueue(maxsize); //创建并初始化队列q
addq(q,bt);
while(!isemptyq(q))
{
t=deleteq(q);
printf("%d\n",t->data);//访问去除队列的节点
if(t->left) addq(q,t->left);
if(t->right) addq(q,t->right);
}
}