二叉树(三):二叉树的遍历
2012-05-27 18:04:57一、先序遍历(DLR)
先序遍历的递归过程为:若二叉树为空,遍历结束。否则,
(1) 访问根结点;
(2)先序遍历根结点的左子树;
(3) 先序遍历根结点的右子树。
算法实现如下:
//前序遍历
public void preorder(Node<T> ptr)
{
if (IsEmpty())
{
Console.WriteLine("Tree is empty");
return;
}
if (ptr != null)
{
Console.Write(ptr.Data + " ");
preorder(ptr.LChild);
preorder(ptr.RChild);
}
}
二、中序遍历(LDR)
中序遍历的递归过程为:若二叉树为空,遍历结束。否则,
(1)中序遍历根结点的左子树;
(2)访问根结点;
(3)中序遍历根结点的右子树。
算法实现如下:
//中序遍历
public void inorder(Node<T> ptr)
{
if (IsEmpty())
{
Console.WriteLine("Tree is empty");
return;
}
if (ptr != null)
{
inorder(ptr.LChild);
Console.Write(ptr.Data + " ");
inorder(ptr.RChild);
}
}
三、后序遍历(LRD)
后序遍历的递归过程为:若二叉树为空,遍历结束。否则,
(1)后序遍历根结点的左子树;
(2)后序遍历根结点的右子树。
(3)访问根结点;
算法实现如下:
//后序列遍历
public void postorder(Node<T> ptr)
{
if (IsEmpty())
{
Console.WriteLine("Tree is empty");
return;
}
if (ptr != null)
{
postorder(ptr.LChild);
postorder(ptr.RChild);
Console.Write(ptr.Data + " ");
}
}
四、层次遍历
所谓二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
算法实现如下:
//层次遍历
public void LevelOrder(Node<T> root)
{
//根结点为空
if (root == null)
{
return;
}
//设置一个队列保存层序遍历的结点
SeqQueue<Node<T>> sq = new SeqQueue<Node<T>>(50);
//根结点入队
sq.EnQueue(root);
//队列非空,结点没有处理完
while (!sq.IsEmpty())
{
//结点出队
Node<T> tmp = sq.DeQueue();
//处理当前结点
Console.WriteLine("{o}", tmp);
//将当前结点的左孩子结点入队
if (tmp.LChild != null)
{
sq.EnQueue(tmp.LChild);
}
if (tmp.RChild != null)
{
//将当前结点的右孩子结点入队
sq.EnQueue(tmp.RChild);
}
}
}