先序遍历(递归)
算法
二叉树为空,则空操作
二叉树非空,访问根节点(D),访问左子树(L),访问右子树(R)
代码
void PreOrderTraverse(BiTree T) //传递的参数为一棵树
{
if(T==NULL)
return ; //为空直接返回
else
{
visit(T); //访问根结点,可以写visit函数进行访问操作
PreOrderTraverse(T->Lchild); //递归遍历左子树
PreOrderTraverse(T->Rchild); //递归遍历右子树
}
}
中序遍历(递归)
算法
二叉树为空,则空操作
二叉树非空,访问左子树(L),访问根节点(D),访问右子树(R)
代码
void InOrderTraverse(BiTree T) //传递的参数为一棵树
{
if(T==NULL)
return ; //为空直接返回
else
{
InOrderTraverse(T->Lchild); //递归遍历左子树
visit(T); //访问根结点,可以写visit函数进行访问操作
InOrderTraverse(T->Rchild); //递归遍历右子树
}
}
后序遍历(递归)
算法
二叉树为空,则空操作
二叉树非空,访问左子树(L),访问右子树(R),访问根节点(D)
代码
void PostOrderTraverse(BiTree T) //传递的参数为一棵树
{
if(T==NULL)
return ; //为空直接返回
else
{
PostOrderTraverse(T->Lchild); //递归遍历左子树
PostOrderTraverse(T->Rchild); //递归遍历右子树
visit(T); //访问根结点,可以写visit函数进行访问操作
}
}
中序遍历非递归算法
代码
void InOrderTraverse(BiTree T)
{
BiTree p,q;
stack<BiTree> S;
p=T;
while(p||!S.empty()) //为空且p==NULL时结束循环
{
if(p) //p不为空(子树存在)
{
S.push(p); //将根节点压入栈顶
p=p->Lchild; //判断下面是否还有左子树(左子树的根节点是否为空)
}
else //为空(子树不存在,访问根节点,在右子树上执行操作)
{
q=S.pop(); //取栈顶元素,即根结点
visit(q); //访问根节点
p=q->Rchild; //在右子树上执行操作,因为左子树已经访问过了
}
}
}
二叉树的层次遍历
算法
将根节点入队
队不为空时循环,从队列中出队一个结点,访问
此节点有左孩子,左孩子入队
此节点有右孩子,右孩子入队
代码
void LevelOrder(BiTree T)
{
queue<BiTree> Q;
Q.enqueue(T); //将根节点入队
while(!Q.empty()) //队列为空时结束循环
{
BiTree q=Q.dequeue(); //队首元素出队
visit(q); //访问此节点
if(!q->Lchild) //此节点有左孩子,左孩子入队
Q.enqueue(q->Lchild);
if(!q->Rchild) //此节点有右孩子,右孩子入队
Q.enqueue(q->Rchild);
}
}