顺序栈遍历二叉树

在做这道题之前,需要用到顺序栈,那么还是老规矩,把之前的做的顺序栈做成一个动态库,这样方便使用,不会顺序栈和制作动态库的同学可以去看我另外的文章。

先去到存放库的文件夹里面看看,有没有动态库

上面很明显有这样的动态库libseqstack.so,因此可以直接来使用

先来上一个二叉树:

分析一下遍历过程:

 下面我们打印像下面这棵树:

直接上代码:

这里面引入了顺序栈1.0的动态库,可以去看我的文章

non_recursion.c

#include <stdio.h>
#include <stdlib.h>
#include "seqstack1.0.h"


//定义每一个结点的数据结
typedef struct _binary_node binary_node;

struct _binary_node {
	char ch;
	binary_node *lchild;
	binary_node *rchild;
	int flag;
}; 

//栈递归
void stack_print(binary_node *node)
{
	//先来初始化一个栈
	t_seq_stack* t_stack = create_stack();
	if(t_stack == NULL) {
		return;
	}
	//直接把根结点先入栈
	push_stack(t_stack,node);
	//然后进行循环
	while(!is_empty(t_stack)) {
		//先把根结点拿出来,左右结点好入栈
		//这里采用先序遍历,DLR,那么R肯定先入栈,最后打出来
		binary_node* node = (binary_node*)top_stack(t_stack);
		//然后出栈
		pop_stack(t_stack);
		//判断一下flag是否等于1,等于打印
		if(node->flag == 1) {
			printf("%c\n",node->ch);
			continue;
		}
		node->flag = 1;//弹出来之后的标识,肯定要从0变成1
		//否则,把右,左,和上面的根接连入栈
		if(node->rchild != NULL) {
			push_stack(t_stack,node->rchild);
		}
		if(node->lchild != NULL) {
			push_stack(t_stack,node->lchild);
		}
		//插入弹出的结点
		push_stack(t_stack,node);
	}
	destroy_stack(t_stack);
}

int main()
{
	//这里把结点创建好
	binary_node node_a = {'A',NULL,NULL,0};
	binary_node node_b = {'B',NULL,NULL,0};
	binary_node node_c = {'C',NULL,NULL,0};
	binary_node node_d = {'D',NULL,NULL,0};
	binary_node node_e = {'E',NULL,NULL,0};
	binary_node node_f = {'F',NULL,NULL,0};

	//把结点相互连接上
	node_a.lchild = &node_b;
	node_a.rchild = &node_c;

	node_b.lchild = &node_d;
	node_b.rchild = &node_e;
	
	node_c.rchild = &node_f;

	stack_print(&node_a);
	//穿件	
	return 0;
}

 结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值