#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));
}
二叉树前中后序遍历非递归及应用
最新推荐文章于 2022-11-18 20:23:20 发布