一. 二叉树的遍历
//先序遍历
void preorder(BinTree BT)
{
if(BT){
printf("%d",BT->data);
preorder(BT->left);
preorder(BT->right);
}
}
//中序遍历
void midorder(BinTree BT)
{
if(BT){
midorder(BinTree BT->left);
printf("%d",BT->data);
midorder(BinTree BT->right);
}
}
//后序遍历
void lastorder(BinTree BT){
if(BT){
lastorder(BinTree BT->left);
lastorder(BinTree BT->right);
printf("%d",BT->data);
}
}
//其实我觉得递归和非递归区别在于,非递归是用while形式,递归用的是函数自己调用自己。
//中序非递归遍历:使用堆栈
void Inorder(BinTree BT){
BinTree T=BT;
stack S=creatstack(Maxsize); //创建并初始化堆栈S
while(T || !isempty(S)){
while(T){ //一直向左并将沿途结点压入堆栈
push(S,T);
T=T->left;
}
while(!isempty(S)){
T=pop(S); //结点弹出堆栈
printf("%5d",T->data); //(访问)打印结点
T=T->right; //转向右子树
}
}
}
//先序非递归遍历:使用堆栈
void Inorder(BinTree BT){
BinTree T=BT;
stack S=creatstack(Maxsize);
while(T||!isempty(S)){
while(T){
push(S,T);
printf("%5d",T->data); //边遍历边打印,并存入栈中,以后需要借助这些根节点进入右子树
T=T->left;
}
while(!isempty(S)){
T=pop(S);
T=T->right;
}
}
}
//后序非递归遍历:使用堆栈,没学