二叉树的遍历

来源:互联网 发布:开源软件是什么 编辑:程序博客网 时间:2024/06/04 15:40

二叉树的遍历,根据根节点位置的不同,可分为前序遍历(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}//至于中序遍历、后序遍历,就自己动下脑筋,写出来吧。


0 0
原创粉丝点击