您的位置:首页 > 编程语言 > C语言/C++

中序遍历非递归算法(C语言版)

2015-11-30 21:39 537 查看
#include <stdio.h>

#include <stdlib.h>

#define M 100

//前序遍历:ABD#E##FG###C##

typedef struct tree/*二叉树*/

{ char data;

struct tree *lchild,*rchild;

}bintree;

typedef bintree *tree;

tree createTree()/*前序遍历建树*/

{

tree t;

char c=getchar();

if(c=='#') return NULL;

else

{ t=(tree)malloc(sizeof(bintree));

t->data=c;

t->lchild=createTree();

t->rchild=createTree();

}

return t;

}

/*非递归中序遍历:思路:边遍历边输出,先输出左子树的最左边一个节点,并放入栈,*/

void intree(tree t)

{ tree stack[M];int top=0;/*定义、初始化栈*/

while(top||t)

{ if(t!=NULL)

{ stack[top++]=t;

t=t->lchild;

}else if(top!=0)

{ t=stack[--top];

printf("%c",t->data);

t=t->rchild;

}

}

}

/*中序遍历求首点*/

tree findFir(tree t)

{

if(t==NULL) return t;

tree p=t;

while(p->lchild!=NULL) p=p->lchild;

return p;

}

/*中序遍历求尾点*/

tree findEnd(tree t)

{

if(t==NULL) return t;

tree q=t;

while(q->rchild!=NULL) q=q->rchild;

return q;

}

int main()

{ tree t,t1;

t=createTree();

printf("\n中序遍历:\n");

intree(t);

printf("\n\n");

t1=findFir(t);

printf("中序遍历的首点:%c\n\n",t1->data);

t=findEnd(t);

printf("中序遍历的尾点:%c",t->data);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: