二叉树前中后序遍历非递归及应用

#include <stdio.h>
#include <stdlib.h>
#define M 50

typedef struct node{
	int data;
	struct node *llink,*rlink;
}BTNode,*BTREE;

void PREORDER(BTREE T)//前序非递归
{
	BTREE STACK[M],p=T;
	int top=-1;
	if(T!=NULL)
		do{
			while(p!=NULL){
				VISIT(p);
				STACK[++top]=p;
				p=p->llink;
			}
			p=STACK[top--];
			p=p->rlink;
		}while(!(p==NULL&&top==-1));
}

void INORDER(BTREE T)//中序非递归
{
	BTREE STACK[M],p=T;
	int top=-1;
	if(T!=NULL)
		do{
			while(p!=NULL){
				STACK[++top]=p;
				p->llink;
			}
			p=STACK[top--];
			VISIT(p);
			p=p->rlink;
		}while(!(p==NULL&&top==-1));
}

void POSTORDER(BTREE T)//后序非递归
{
	BTREE STACK1[M],p=T;
	int STACK2[M],flag,top=-1;
	if(T!=NULL)
		do{
			while(p!=NULL){
				STACK1[++top]=p;
				STACK2[top]=0;
				p=p->llink;
			}
			p=STACK1[top];
			flag=STACK2[top--];
			if(flag==0){
				STACK1[++top]=p;
				STACK2[top]=1;
				p=p->rlink;
			}
			else{
				VISIT(p);
				p=NULL;
			}
		}while(!(p==NULL&&top==-1));
}



int DEPTHBT(BTREE T)//中序求深度
{
	BTREE STACK1[M], p=T ;
	int STACK2[M];
	int curdepth, maxdepth = 0, top=-1;
	if(T!=NULL){
		curdepth = 1 ;
		do{
			while(p!=NULL){
				STACK1[++top] = p; 
				STACK2[top] = curdepth ; 
				p = p->llink;
				curdepth++;
			}
			p=STACK1[top];
			curdepth = STACK2[top--];
			if(p->llink ==NULL&&p->rlink==NULL)
				if(curdepth>maxdepth)
					maxdepth=curdepth;
			p=p->rlink;
			curdepth++;
		}while(!(p==NULL&&top==-1));
	}
	return (maxdepth);
}

int LAYER(BTREE T,int a)//层次后续非递归
{
	BTREE STACK1[M],p=T;
	int STACK2[M],flag,top=-1;
	do{
		while(p!=NULL){
			STACK1[++top]=p;
			STACK2[top]=0;
			p=p->llink;
		}
		p=STACK1[top];
		flag=STACK2[top--];
		if(flag==0){
			STACK1[++top]=p;
			STACK2[top]=1;
			p=p->rlink;
		}
		else{
			if(p->data==a)
				return(top+2);
			p=NULL;
		}
	}while(!(p==NULL&&top==-1));
}

BTREE DELETEBT(BTREE T,int a)//删除前序非递归
{
	BTREE STACK[M],q,p=T;
	int top=-1;
	if(p->data==a){
		DELETE(T);
		return NULL;
	}
	else{
		do{
			while(p!=NULL){
				if(p->data==a){
					if(q->llink==p)
						q->llink=NULL;
					else
						q->rlink=NULL;
					DELETE(p);
					return T;
				}
				else
				STACK[++top]=p;
				q=p;
				p=p->llink;
			}
			p=STACK[top--];
			q=p;
			p=p->rlink;
		}while(!(p==NULL&&top==-1));
	}
}
int SUM_N1(BTREE T)//度为1的前序非递归
{
	BTREE p=T,STACK[M];
	int top=-1,n=0;
	if(T!=NULL)
		do{
			while(p!=NULL){
				if(p->llink!=NULL&&p->rlink==NULL||p->llink==NULL&&p->rlink!=NULL)
					n++;
				STACK[++top]=p;
				p=p->llink;
			}
			p=STACK[top--];
			p=p->rlink;
		}while(!(p==NULL&&top==-1));
		return n;

}

void ANCESTOR(BTREE T,int a)//元素祖先后续非递归
{
	BTREE STACK1[M],p=T;
	int flag,top=-1,STACK2[M];
	if(T!=NULL)
		do{
			while(p!=NULL){
				STACK1[++top]=p;
				STACK2[top]=0;
				p=p->llink;
			}
			p=STACK1[top];
			flag=STACK2[top--];
			if(flag==0){
				STACK1[++top]=p;
				STACK2[top]=1;
			}
			else{
				if(p->data==a){
					while(top!=-1)
						printf("%d",STACK1[top--]->data);
					break;
				}
				else
					p=NULL;
			}
		}while(!(p==NULL&&top==-1));
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值