现在的位置: 首页 > 综合 > 正文

二叉树的遍历

2016年12月09日 ⁄ 综合 ⁄ 共 1017字 ⁄ 字号 评论关闭

二叉树的遍历,根据根节点位置的不同,可分为前序遍历(PreOrder)、中序遍历(MidOrder)和后序遍历(PostOrder)。所谓的前、中、后,指的是根所在的位置。以前序遍历为例,根与左右子树的输出次序为:根、左、右。

二叉树对应的结构体类型如下:

<pre name="code" class="cpp">typedef struct node{
int data;  //数据域
struct node  *left; //左孩子指针
struct node  *right; //右孩子指针
}BiTree;

下面介绍前序遍历的方法:

1、递归实现

void PreOrder(BiTree *tp)
{
if(tp==NULL)//节点为空
return;
else
{
printf("%5d",tp->data);//输出根节点.就三句代码。如果把这句放到中间,那就是中序遍历;放到最后,就是后序遍历
PreOrder(tp->left);//前序遍历左子树
PreOrder(tp->right);//前序遍历右子树
}
}

说明 :因为树的定义就是递归的,用递归方法遍历,十分地简明易懂,但效率却不高,要是面试的时候,通常会被要求写非递归方法,因此掌握下面的遍历方法十分必要

2、非递归方法实现

//其实递归调用是要用到栈的(隐式的)。不使用函数递归的调用,就得显式地使用栈。可以自己定义一个一维数组,作栈用。

void PreOrder(BiTree *tp)
{
BiTree *p;//工作指针,用于遍历
BiTree *stack[MAXSIZE];//栈定义,其实就是个指针数组,用于存放指针变量。具体大小看个人情况吧,就不写具体数字了
int top=-1;//定义并初始化栈顶指针 
  if(tp==NULL)//同样地,要判断输入节点是否为空
<span style="white-space:pre">	</span>return ;
  else
  {
   top++;
   stack[top]=tp;
   while(top>-1)
   {
    p=stack[top];
    top--;
    printf("%5d",p->data);
   if(p->right)
   {
    top++;
    stack[top]= p->right;
   }
   if(p->left)
   {
    top++;
    stack[top]=p->left;
   }//这里关键是栈是先进后出的,则想要让右子树后打印,就得让右子树先入栈
  }//while
 }//else
}//至于中序遍历、后序遍历,就自己动下脑筋,写出来吧。

抱歉!评论已关闭.