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