二叉树的非递归遍历(c语言 链式储存)

#include<stdio.h>
#include<stdlib.h>  
#define MAXSIZE 200 
  
 /* 定义二叉树节点类型 */ 
 typedef struct node 
 { 
	char data;
	struct node *lchild, *rchild; 
 }BTNode;   
 
 /* 函数声明 */ 
 BTNode* CreatBitTree(); 
 void PreOrder(BTNode*); 
 void InOrder(BTNode*); 
 void PostOrder(BTNode*);  
  
 /* 主函数 */ 
 int main() 
 { 
	BTNode *root = NULL; 
	root = CreatBitTree(); 
	PreOrder(root); 
	InOrder(root); 
         PostOrder(root); 
	system("pause");
	return 0; 
 }   
 /* 递归前序建立二叉树 */ 
 BTNode* CreatBitTree() 
 { 
	char ch; 
	BTNode *b; 
	scanf("%c", &ch); 
	/* 遇到空节点停止递归 */ 
	if (ch == '#') 
	{
		b = NULL; 
	} 
	else 
	{ 
		 b = (BTNode*) malloc(sizeof(BTNode)); 
		/* 建立根节点 */ 
		b->data = ch; 
		/* 递归先序建立左子树 */
		b->lchild = CreatBitTree(); 
		/* 递归先序建立右子树 */ 
		b->rchild = CreatBitTree();
	} 
	return b;
 }   
 
/* 非递归前序遍历二叉树 */ 
void PreOrder(BTNode* b) 
{ 
	BTNode *stack[MAXSIZE], *p; 
	int top = -1; 
	if (b != NULL) 
	{ /* 根节点入栈 */ 
		top++; 
		stack[top] = b; 
		/* 栈不空时循环 */ 
		while (top > -1) 
		{ /* 出栈并访问该节点 */ 
			p = stack[top]; 
			top--; 
			printf("%c ", p->data); 
			/* 右孩子入栈 */ 
			if (p->rchild != NULL) 
			{ 
				top++; 
				stack[top] = p->rchild; 
			} 
			/* 左孩子入栈 */ 
			if (p->lchild != NULL)
			{ 
				top++; 
				stack[top] = p->lchild; 
			} 
		} 
		printf("/n"); 
	} 
}   

/* 非递归中序遍历二叉树 */ 
void InOrder(BTNode* b) 
{ 
	BTNode *stack[MAXSIZE], *p; 
	int top = -1; 
	if (b != NULL) 
         { 
          p = b; 
          while (top > -1 || p != NULL) 
          { /* 扫描p的所有左节点并入栈 */ 
               while (p != NULL) 
               { 
                   top++; 
                   stack[top] = p; 
                   p = p->lchild; 
               } 
               if (top > -1) 
               { /* 出栈并访问该节点 */ 
		 p = stack[top]; 
		 top--;
		 printf("%c ", p->data); 
		 /* 扫描p的右孩子 */ 
		 p = p->rchild; 
               } 
          } 
          printf("/n");
    } 
}   

/* 非递归后序遍历二叉树 */ 
void PostOrder(BTNode* b) 
{ 
	BTNode *stack[MAXSIZE], *p; 
	int sign, top = -1; 
	if (b != NULL) 
	{ 
		do 
		{ 
			/* b所有左节点入栈 */ 
			while (b != NULL) 
			{
				top++; 
				stack[top] = b; 
				b = b->lchild; 
			} 
			/* p指向栈顶前一个已访问节点 */ 
			p = NULL; 
			/* 置b为已访问 */ 
			sign = 1; 
			while (top != -1 && sign) 
			{ 
				/* 取出栈顶节点 */ 
				b = stack[top]; 
				/* 右孩子不存在或右孩子已访问则访问b */ 
				if (b->rchild == p) 
				{
					printf("%c ", b->data); 
					top--; 
					/* p指向被访问的节点 */ 
					p = b; 
				} 
				else 
				{   
					/* b指向右孩子节点 */ 
					b = b->rchild; 
					 /* 置未访问标记 */ 
					sign = 0; 
				} 
			} 
		}while (top != -1); 
		printf("/n"); 
	}
}

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值