/**
* 递归前序遍历
* @param T
*/voidPreOrderTraverse(BinTree T){if(T){printf("%c\t",T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}}/**
* 中序遍历二叉树
* @param T
*/voidInorderTraverse(BinTree T){if(T){InorderTraverse(T->lchild);printf("%c\t",T->data);InorderTraverse(T->rchild);}}/**
* 后续遍历二叉树
* @param T
*/voidPostOrderTraverse(BinTree T){if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);printf("%c\t",T->data);}}
2、非递归
/**
* 非递归前序遍历
*/voidPreOrder(BinTree T){//创建一个数组,用数组来模仿栈
BinTree stack[15];int top =-1;//栈顶指针
BinTree p = T;while(p!=NULL|| top!=-1){//当p不为空是将结点压入栈中if(p!=NULL){
stack[++top]= p;printf("%c\t",p->data);//前序遍历在压入栈时候访问结点数据
p = p->lchild;}else{//当p为空,证明p的父结点没有左子树,则将p弹出访问右子树
p = stack[top];
top--;
p = p->rchild;}}}/**
* 非递归遍历二叉树
* @param T
*/voidInOrder(BinTree T){
BinTree stack[15];//定义一个数组用来模拟栈的使用int top =-1;
BinTree p = T;while(p!=NULL||top!=-1){if(p!=NULL){//将p结点压入栈
stack[++top]= p;
p = p->lchild;}else{
p = stack[top--];printf("%c\t",p->data);
p = p->rchild;}}}/**
* 非递归后续遍历二叉树
* @param T
*/voidPostOrder(BinTree T){
BinTree stack[15];int flage[15];int top =-1;//栈顶指针
BinTree p = T;while(p!=NULL||top!=-1){if(p!=NULL){
stack[++top]= p;
flage[top]=1;//第一次访问,设个标志为1
p = p->lchild;}else{if(flage[top]==1){
p = stack[top];//获取栈顶元素,但是不取出
flage[top]=2;//标志这第二次访问
p = p->rchild;//访问右子树}else{//第二次访问,证明也已经访问完了右子树,这时访问根节点
p = stack[top--];printf("%c\t",p->data);
p =NULL;//置空,以便继续退栈,}}}}
3、层次遍历
/**
* 层次遍历二叉树
* 层次遍历需要借助队列,先进先出,使用一个数组来模拟队列操作,循环队列
* @param T
*/voidLevelTraverse(BinTree T){
BinTree queue[15];int front =0;int rear =0;
BinTree p = T;if(!T){return;}else{
queue[rear]= p;
rear =(rear+1)%15;while(rear!=front){//当队列不为空时
p = queue[front];printf("%c\t",p->data);
front =(front+1)%15;//元素出栈if(p->lchild!=NULL){//该结点的左孩子不为空
queue[rear]= p->lchild;
rear =(rear+1)%15;}if(p->rchild!=NULL){
queue[rear]= p->rchild;
rear =(rear+1)%15;}}}}
三:寻找指定二叉树结点
1、递归查找
/**
* 递归查找指定元素的结点
* @param T
* @param e
* @return 返回当前元素的地址
*/
BinTree LocateNode(BinTree T,BinElemType e){
BinTree p =NULL;if(T!=NULL){if(T->data == e){
p = T;}else{if(p=LocateNode(T->lchild,e)){return p;}if(p=LocateNode(T->rchild,e)){return p;}}}return p;}
3、非递归查找
/**
* 非递归前序遍历查找在二叉树中给定数据的结点
* @param T
* @param e
* @return
*/
BinTree FindTreeNode(BinTree T,BinElemType e){//使用非递归前序遍历寻找
BinTree stack[15];//创建一个栈int top =-1;
BinTree p = T;while(p!=NULL||top!=-1){if(p!=NULL){//判断是否相等if(p->data == e){return p;}else{
stack[++top]= p;
p = p->lchild;}}else{
p = stack[top--];
p = p->rchild;}}returnNULL;}/**
* 非递归后续遍历查找结点
* @param e
* @return
*/
BinTree PostFindTreeNode(BinTree T,BinElemType e){
BinTree stack[15];int top =-1;int flage[15];
BinTree p = T;while(p!=NULL||top!=-1){if(p!=NULL){
stack[++top]= p;
flage[top]=1;
p = p->lchild;}else{if(flage[top]!=2){//左子树为空,进行回退
p = stack[top];
flage[top]=2;
p = p->rchild;}else{
p = stack[top--];if(e == p->data){return p;}else{
p =NULL;}}}}returnNULL;}
/**
* 非递归前序遍历统计二叉树结点的个数
* @param T
* @return
*/intCountNodePre(BinTree T){int number =0;
BinTree stack[15];int top =-1;
BinTree p = T;while(p!=NULL||top!=-1){if(p!=NULL){//将结点压入栈
stack[++top]= p;
number++;
p = p->lchild;}else{
p = stack[top--];
p = p->rchild;}}return number;}