二叉树的非递归遍历与递归打印 先序遍历

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define max_size 20  //person姓名的大小
#define my_false 0
#define my_true 1

//栈
typedef struct StackNode
{
	struct StackNode* next;
}StackNode;

typedef struct StackList
{
	StackNode top;  //指向栈顶的指针
    int count;
}StackList;

StackList* init_stack()
{
	StackList * stack = (StackList*)malloc(sizeof(StackList));
	stack->count = 0;
	stack->top.next = NULL;
	return stack;
}

void push_stack(StackList* stack , StackNode* data) //入栈
{
	if(data == NULL)
	{
		return;
	}
	data->next = stack->top.next;
	stack->top.next = data;
	stack->count++;
}

void pop_stack(StackList* stack) //出栈
{
	if(stack == NULL)
	{
		return;
	}
	stack->top.next = stack->top.next->next;
	stack->count--;
}

StackNode* top_stack(StackList* stack)
{
	if(stack == NULL)
	{
		return NULL;
	}
	return stack->top.next;
}
//测试栈
typedef struct person
{
	StackNode node;
	char name[max_size];
	int age;
}Person;
//打印
void My_print(StackNode* data)
{
	person* p = (person*)data;
	printf("%s  %d\n" , p->name ,p->age);
}


//**********************************************************************************//
//二叉树
typedef struct BTNODE
{
	char ch;
	struct BTNODE* Lchild;
	struct BTNODE* Rchild;
}BTNode;
//因为栈是企业链表的形式,所以对二叉树进行封装
typedef struct BTNode_stack
{
	StackNode node;
	BTNode* root;   //二叉树的根节点
	int flag;       //用来表示true 和 flase
}BTNode_stack;

//创建结点
BTNode_stack* createBTNode_stack(BTNode* root ,int flag)
{
	BTNode_stack* newnode = (BTNode_stack*)malloc(sizeof(BTNode_stack));
	newnode->root = root;
	newnode->flag = flag;
	return newnode;
}
//二叉树的非递归遍历
void NonRecursion(BTNode* root)
{
	StackList* stack = init_stack();
	push_stack(stack,(StackNode*)createBTNode_stack(root,my_false)); //入栈
	while(stack->count > 0)
	{
		BTNode_stack* node = (BTNode_stack*)top_stack(stack);  //返回栈顶元素
		pop_stack(stack);                                      //出栈
		//判断弹出的树结点是否为空
		if(node->root == NULL)
		{
			continue;
		}
		if(node->flag == my_true)
		{
			printf("%c  ",node->root->ch);
		}
		else
		{ 
			push_stack (stack,(StackNode*)createBTNode_stack( node->root->Rchild ,my_false ));
			push_stack (stack,(StackNode*)createBTNode_stack( node->root->Lchild ,my_false ));
			node->flag = my_true;
			push_stack (stack,(StackNode*)node);
		}
	}
}
//二叉树的递归遍历
void Recursion(BTNode* root) //根结点
{
	if(root == NULL)
	{
	     return;
	}
	printf("%c  ",root->ch);
	//递归遍历
	Recursion(root->Lchild);
	Recursion(root->Rchild);
}
//创建树 A,B,C,D,E,F,G,H
void CreateBinaryTree()
{
	//创建结点
	BTNode node1 = {'A' ,NULL ,NULL };
	BTNode node2 = {'B' ,NULL ,NULL };
	BTNode node3 = {'C' ,NULL ,NULL };
	BTNode node4 = {'D' ,NULL ,NULL };
	BTNode node5 = {'E' ,NULL ,NULL };
	BTNode node6 = {'F' ,NULL ,NULL };
	BTNode node7 = {'G' ,NULL ,NULL };
	BTNode node8 = {'H' ,NULL ,NULL };
	//建立关系
	node1.Lchild = &node2;
	node1.Rchild = &node6;
	node2.Rchild = &node3;
	node3.Lchild = &node4;
	node3.Rchild = &node5;
	node6.Lchild = &node7;
	node7.Lchild = &node8;
	//非递归打印
	NonRecursion(&node1);
	printf("\n");
	//递归打印
	Recursion(&node1);
}


int main()
{
	CreateBinaryTree();
	printf("\n");

	//测试栈 与二叉树非递归遍历无关
	StackList* stack = init_stack();
	person p1 = { NULL ,"aaa",20 };
	person p2 = { NULL ,"bbb",21 };
	person p3 = { NULL ,"ccc",22 };
	push_stack(stack,(StackNode*)&p1);
	push_stack(stack,(StackNode*)&p2);
	push_stack(stack,(StackNode*)&p3);
	while(stack->count>0)
	{
		My_print(top_stack(stack));
		pop_stack(stack);
	} 
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值