先放定义
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElemenType Data;
BinTree Left;
BinTree Right;
};
二叉树的中序非递归遍历
void InOrderTraversal(BinTree BT)
{
BinTree T=BT;
Stack S=CreatStack(MaxSize);
while(T||!isEmpty(S)){//结点不空,或者堆栈中有元素
while(T){//当左子树未遍历完时
Push(S,T);
T=T->Left;
}
if(!isEmpty(S)){//此时左子树遍历结束,弹出栈顶元素,接着访问栈顶元素的右子树
T=Pop(S);
printf("%5d",T->Data);
T=T->Data;
}
}
}//中序遍历非递归算法
/*实现思路:
1.遇到一个结点,就将其压栈,遍历其左子树
2.当左子树遍历完,Pop栈顶元素,访问它
3.访问结束后,遍历其右子树 */
二叉树的先序遍历与之类似
把printf提前即可
void InOrderTraversal(BinTree BT)
{
BinTree T=BT;
Stack S=CreatStack(MaxSize);
while(T||!isEmpty(S)){//结点不空,或者堆栈中有元素
while(T){//当左子树未遍历完时
printf("%5d",T->Data);
Push(S,T);
T=T->Left;
}
if(!isEmpty(S)){//此时左子树遍历结束,弹出栈顶元素,接着访问栈顶元素的右子树
T=Pop(S);
T=T->Data;
}
}
}//先序遍历非递归算法
二叉树层序遍历(用队列实现)
void LevelOrderTravel(BinTree BT)
{
Queue Q;
BinTree T;
if(!BT) return;
Q=CreatQueue(MaxSize);
AddQ(Q,BT);
while(!isEmptyQ(Q)){
T=DeleteQ(Q);
printf("%d",T->Data);
if(T->Left) AddQ(Q,T->Left);
if(T->Right) AddQ(Q,T->Right);
}
}
求二叉树高度(递归实现)
int PostGetHeight(BinTree BT)
{
int HL,HR,MaxH;
if(BT){
HL=PostGetHeight(BT->Left);
HR=PostGetHeight(BT->Right);
MaxH=(HL>HR)?HL:HR;
return (MaxH+1);
}
else return 0;
}