二叉树的四种遍历
void InorderTraversal(BinTree BT)
{//中序遍历
if(BT)
{
InorderTraversal(BT->left);
printf("%d",BT->Data);
InorderTraversal(BT->right);
}
}
void PreorderTraversal(BinTree BT)
{//前序遍历
if(BT)
{
printf("%d",BT->Data);
PreorderTraversal(BT->left);
PreorderTraversal(BT->right);
}
}
void PostorderTraversal(BinTree BT)
{//后序遍历
if(BT)
{
PostorderTraversal(BT->left);
PostorderTraversal(BT->right);
printf("%d",BT->Data);
}
}
void LevelorderTraversal(BinTree BT)
{//层序遍历
Queue Q;
BinTree T;
if(!BT)return;//若是空树直接返回
Q=CreateQueue();//创建空队列Q
AddQ(Q,BT);
while(!IsEmpty(Q))
{
T=DeleteQ(Q);
printf("%d",T->Data);//访问取出队列的结点
if(T->left)AddQ(Q,T->left);
if(T->right)AddQ(Q,T->right);
}
}
前中后三种遍历的区别在于printf()函数的位置,也即对应了访问到第几次会输出此结点。
层序遍历则是弹出根节点,依次将它的左右子结点加入队列,并依此循环,直到队列为空。
中序前序遍历非递归遍历算法
void InorderTraversal(BinTree BT)
{//中序遍历非递归遍历算法
Stack S=CreateStack(MAXSIZE);
BinTree T=BT;
while(T||!IsEmpty(S))
{
while(T)
{
Push(S,T);
T=T->left;
}
if
(!IsEmpty(S))
{
T=Pop(S);
printf("%d",T->Data);
T=T->right;
}
}
}
void PreorderTraversal (BinTree BT)
{//前序遍历非递归算法
Stack S=CreateStack(MAXSIZE);
BinTree T=BT;
while(T||!IsEmpty(S))
{
while(T)
{
Push(S,T);
printf("%d",T->Data);
T=T->left;
}
if(!IsEmpty(S))
{
T=Pop(S);
T=T->right;
}
}
}
两种非递归遍历算法循环的条件都相同,当T不为空或栈非空时继续循环,区别只在于printf()的位置不同,前序是在Push()后即输出,而中序则是在Pop(S)后输出,分别对应着第一次,第二次遍历此节点。
输出二叉树中的叶子结点
void PreOrderPrintLeaves(BinTree BT)
{
if(BT)
{
if(!BT->left&&!BT->right)
printf("%d",BT->Data);
PreOrderPrintLeaves(BT->left);
PreOrderPrintLeaves(BT->right);
}
}
整体就是前序遍历,区别只是在于判断结点是否有左右子结点,若没有即输出此结点,否则向下遍历。
求二叉树的高度
void PreOrderPrintLeaves(BinTree BT)
{
int ML,MR,MAXH;
if(BT)
{
ML=PreOrderPrintLeaves(BT->left);
MR=PreOrderPrintLeaves(BT->right);
MAXH=(ML>MR)?ML:MR;
return (MAXH+1);
}
else return 0;
}
将树从根节点分为两部分,分别计算左子树和右子树的高度,取其中的最大值,加1(根结点)即得到二叉树的高度。